diff --git a/core/lib/Drupal/Core/Template/TwigTemplate.php b/core/lib/Drupal/Core/Template/TwigTemplate.php
index ee864ca..cb2d91d 100644
--- a/core/lib/Drupal/Core/Template/TwigTemplate.php
+++ b/core/lib/Drupal/Core/Template/TwigTemplate.php
@@ -41,8 +41,9 @@
    */
   final protected function getContextReference(&$context, $item)
   {
-    // Optimized version
-    if (!isset($context[$item])) {
+    // Optimized version. NULL is a valid value for $context[$item], we only
+    // want to error if it hasn't been defined at all.
+    if (!isset($context[$item]) && !array_key_exists($item, $context)) {
       // We don't want to throw an exception, but issue a warning instead.
       // This is the easiest way to do so.
       // @todo Decide based on prod vs. dev setting
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
index c62f7c3..816c5ff 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTestTwig.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Theme\ThemeTest.
+ * Contains Drupal\system\Tests\Theme\ThemeTestTwig.
  */
 
 namespace Drupal\system\Tests\Theme;
@@ -10,7 +10,7 @@
 use Drupal\simpletest\WebTestBase;
 
 /**
- * Tests low-level theme functions.
+ * Tests theme functions with the Twig engine.
  */
 class ThemeTestTwig extends WebTestBase {
 
@@ -69,4 +69,20 @@ function testFindThemeTemplates() {
     $templates = drupal_find_theme_templates($cache, '.html.twig', drupal_get_path('theme', 'test_theme_twig'));
     $this->assertEqual($templates['node__1']['template'], 'node--1', 'Template node--1.html.twig was found in test_theme_twig.');
   }
+
+  /**
+   * Tests that the Twig engine handles PHP data correctly.
+   */
+  function testTwigVariableDataTypes() {
+    // Test NULL values.
+    // @todo Test multiple PHP data types.
+    config('system.theme')
+      ->set('default', 'test_theme_twig')
+      ->save();
+    $this->drupalGet('theme-test/template-test');
+    foreach (_test_theme_twig_php_values() as $type => $value) {
+      $this->assertRaw('<li>' . $type . ': ' . $value['expected'] . '</li>');
+    }
+  }
+
 }
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.module b/core/modules/system/tests/modules/theme_test/theme_test.module
index 137fdfc..a7bdddf 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.module
+++ b/core/modules/system/tests/modules/theme_test/theme_test.module
@@ -172,3 +172,41 @@ function theme_theme_test_foo($variables) {
   return $variables['foo'];
 }
 
+/*
+ * Helper function to test PHP variables in the Twig engine.
+ */
+function _test_theme_twig_php_values() {
+  // Prefix each variable with "twig_" so that twig doesn't get confused
+  // between a variable and a primitive. Arrays are not tested since they should
+  // be a Drupal render array.
+  return array(
+    'twig_null' => array(
+      'value' => NULL,
+      'expected' => '',
+    ),
+    'twig_bool_false' => array(
+      'value' => FALSE,
+      'expected' => '',
+    ),
+    'twig_bool_true' => array(
+      'value' => TRUE,
+      'expected' => '1',
+    ),
+    'twig_int' => array(
+      'value' => 1,
+      'expected' => '1',
+    ),
+    'twig_int_0' => array(
+      'value' => 0,
+      'expected' => '0',
+    ),
+    'twig_float' => array(
+      'value' => 122.34343,
+      'expected' => '122.34343',
+    ),
+    'twig_string' => array(
+      'value' => 'Hello world!',
+      'expected' => 'Hello world!',
+    ),
+  );
+}
diff --git a/core/modules/system/tests/themes/test_theme_twig/test_theme_twig.theme b/core/modules/system/tests/themes/test_theme_twig/test_theme_twig.theme
new file mode 100644
index 0000000..29c4b3f
--- /dev/null
+++ b/core/modules/system/tests/themes/test_theme_twig/test_theme_twig.theme
@@ -0,0 +1,13 @@
+<?php
+use Drupal\system\Tests\Theme\ThemeTestTwig;
+/**
+ * @file
+ * Theme to help test the Twig engine.
+ */
+
+/**
+ * Implements THEME_preprocess_theme_test_template_test().
+ */
+function test_theme_twig_preprocess_theme_test_template_test(&$variables) {
+  $variables['php_values'] = _test_theme_twig_php_values();
+}
diff --git a/core/modules/system/tests/themes/test_theme_twig/theme_test.template_test.html.twig b/core/modules/system/tests/themes/test_theme_twig/theme_test.template_test.html.twig
index 6cda319..3c479fe 100644
--- a/core/modules/system/tests/themes/test_theme_twig/theme_test.template_test.html.twig
+++ b/core/modules/system/tests/themes/test_theme_twig/theme_test.template_test.html.twig
@@ -1,2 +1,8 @@
 {# Output for Theme API test #}
 Success: Template overridden.
+
+<ul>
+{% for key, php_value in php_values %}
+  <li>{{ key }}: {{ php_value.value }}</li>
+{% endfor %}
+</ul>
\ No newline at end of file
