diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index e44f13d..4c4bab2 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1712,8 +1712,6 @@ function theme_mark($variables) {
  * @see http://drupal.org/node/1842756
  */
 function template_preprocess_item_list(&$variables) {
-  $variables['title'] = (string) $variables['title'];
-
   foreach ($variables['items'] as &$item) {
     $attributes = array();
     // If the item value is an array, then it is a render array.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php
index 7aa294c..17b975c 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/FunctionsTest.php
@@ -60,6 +60,13 @@ function testItemList() {
     $expected = '<div class="item-list"><h3>Some title</h3>No items found.</div>';
     $this->assertThemeOutput('item_list', $variables, $expected, 'Empty %callback generates empty string with title.');
 
+    // Verify that header set to "0" is output.
+    $variables = array();
+    $variables['title'] = 0;
+    $variables['empty'] = 'No items found.';
+    $expected = '<div class="item-list"><h3>0</h3>No items found.</div>';
+    $this->assertThemeOutput('item_list', $variables, $expected, '%callback with header set to "0" generates a title.');
+
     // Verify that empty text is not displayed when there are list items.
     $variables = array();
     $variables['title'] = 'Some title';
diff --git a/core/modules/system/templates/item-list.html.twig b/core/modules/system/templates/item-list.html.twig
index 34e1802..bd71e7f 100644
--- a/core/modules/system/templates/item-list.html.twig
+++ b/core/modules/system/templates/item-list.html.twig
@@ -20,7 +20,7 @@
 #}
 {%- if items or empty -%}
   <div class="item-list">
-    {%- if title -%}
+    {%- if title is not empty -%}
       <h3>{{ title }}</h3>
     {%- endif -%}
     {%- if items -%}
