diff --git a/src/view/form/control/AphrontFormControl.php b/src/view/form/control/AphrontFormControl.php
--- a/src/view/form/control/AphrontFormControl.php
+++ b/src/view/form/control/AphrontFormControl.php
@@ -56,11 +56,22 @@
     return $this->label;
   }
 
+  /**
+   * Set the Caption
+   * The Caption shows a tip usually nearby the related input field.
+   * @param string|PhutilSafeHTML|null
+   * @return self
+   */
   public function setCaption($caption) {
     $this->caption = $caption;
     return $this;
   }
 
+  /**
+   * Get the Caption
+   * The Caption shows a tip usually nearby the related input field.
+   * @return string|PhutilSafeHTML|null
+   */
   public function getCaption() {
     return $this->caption;
   }
@@ -203,11 +214,18 @@
       $custom_class .= ' aphront-form-control-nolabel';
     }
 
-    if (phutil_nonempty_string($this->getCaption())) {
+    // The Caption is a tip usually shown below the input box
+    $caption_content = $this->getCaption();
+
+    // The Caption can be stuff like PhutilSafeHTML and other objects that
+    // can be casted to a string. After this cast we have never null.
+    $caption_content = phutil_string_cast($caption_content);
+
+    if ($caption_content !== '') {
       $caption = phutil_tag(
         'div',
         array('class' => 'aphront-form-caption'),
-        $this->getCaption());
+        $this->getCaption()); // Do not replace this with $caption_content
     } else {
       $caption = null;
     }