diff --git a/src/parser/PhutilDocblockParser.php b/src/parser/PhutilDocblockParser.php
--- a/src/parser/PhutilDocblockParser.php
+++ b/src/parser/PhutilDocblockParser.php
@@ -97,19 +97,39 @@
       foreach ($matches as $match) {
         list($_, $type, $data) = $match;
         $data = trim($data);
-        if (isset($special[$type])) {
-          $special[$type] = $special[$type]."\n".$data;
-        } else {
+
+        // For flags like "@stable" which don't have any string data, set the
+        // value to true.
+        if (!strlen($data)) {
+          $data = true;
+        }
+
+        if (!isset($special[$type])) {
           $special[$type] = $data;
+        } else {
+          if (!is_array($special[$type])) {
+            $special[$type] = (array)$special[$type];
+          }
+          $special[$type][] = $data;
         }
       }
     }
 
-    // For flags like "@stable" which don't have any string data, set the value
-    // to true.
+    // Convert `array(true, true, true)` to `true`.
     foreach ($special as $type => $data) {
-      if (!strlen(trim($data))) {
-        $special[$type] = true;
+      if (is_array($data)) {
+        $all_trues = true;
+
+        foreach ($data as $value) {
+          if ($value !== true) {
+            $all_trues = false;
+            break;
+          }
+        }
+
+        if ($all_trues) {
+          $special[$type] = true;
+        }
       }
     }
 
diff --git a/src/parser/__tests__/PhutilDocblockParserTestCase.php b/src/parser/__tests__/PhutilDocblockParserTestCase.php
--- a/src/parser/__tests__/PhutilDocblockParserTestCase.php
+++ b/src/parser/__tests__/PhutilDocblockParserTestCase.php
@@ -52,7 +52,8 @@
       case 'multi-specials.docblock':
         $this->assertEqual(
           array(
-            'special' => "north\nsouth",
+            'special' => array('north', 'south'),
+            'stable' => true,
           ),
           $specials);
         $this->assertEqual(
@@ -64,6 +65,7 @@
           array(
             'type' => 'type',
             'task' => 'task',
+            'special' => array('dot', 'dot', 'dash'),
           ),
           $specials);
         $this->assertEqual(
@@ -83,7 +85,7 @@
       case 'specials-with-hyphen.docblock':
         $this->assertEqual(
           array(
-            'repeat-hyphen'     => "a\nb",
+            'repeat-hyphen'     => array('a', 'b'),
             'multiline-hyphen'  => 'mmm nnn',
             'normal-hyphen'     => 'x',
           ),
@@ -110,6 +112,13 @@
           ),
           $specials);
         break;
+      case 'mixed-types.docblock':
+        $this->assertEqual(
+          array(
+            'special' => array('squirrels', true),
+          ),
+          $specials);
+        break;
       default:
         throw new Exception(pht("No test case to handle file '%s'!", $file));
     }
diff --git a/src/parser/__tests__/docblock/mixed-types.docblock b/src/parser/__tests__/docblock/mixed-types.docblock
new file mode 100644
--- /dev/null
+++ b/src/parser/__tests__/docblock/mixed-types.docblock
@@ -0,0 +1,4 @@
+/**
+ * @special squirrels
+ * @special
+ */
diff --git a/src/parser/__tests__/docblock/multi-specials.docblock b/src/parser/__tests__/docblock/multi-specials.docblock
--- a/src/parser/__tests__/docblock/multi-specials.docblock
+++ b/src/parser/__tests__/docblock/multi-specials.docblock
@@ -1,4 +1,8 @@
 /**
  * @special north
  * @special south
+ *
+ * @stable
+ * @stable
+ * @stable
  */
diff --git a/src/parser/__tests__/docblock/specials.docblock b/src/parser/__tests__/docblock/specials.docblock
--- a/src/parser/__tests__/docblock/specials.docblock
+++ b/src/parser/__tests__/docblock/specials.docblock
@@ -1,4 +1,8 @@
 /**
  * @type type
  * @task task
+ *
+ * @special dot
+ * @special dot
+ * @special dash
  */