diff --git a/core/modules/field/lib/Drupal/field/FieldInfo.php b/core/modules/field/lib/Drupal/field/FieldInfo.php
index 2639c25..d87684d 100644
--- a/core/modules/field/lib/Drupal/field/FieldInfo.php
+++ b/core/modules/field/lib/Drupal/field/FieldInfo.php
@@ -402,12 +402,14 @@ public function getBundleInstances($entity_type, $bundle) {
       return array();
     }
 
-    // Read from the persistent cache.
-    if ($cached = $this->cacheBackend->get("field_info:bundle:$entity_type:$bundle")) {
-      $info = $cached->data;
+    // Read from the persistent cache. We read fields first, since
+    // unserialization the cached instance objects tries to access the field
+    // definitions.
+    if ($cached_fields = $this->cacheBackend->get("field_info:bundle:fields:$entity_type:$bundle")) {
+      $fields = $cached_fields->data;
 
       // Extract the field definitions and save them in the "static" cache.
-      foreach ($info['fields'] as $field) {
+      foreach ($fields as $field) {
         if (!isset($this->fieldsById[$field['uuid']])) {
           $this->fieldsById[$field['uuid']] = $field;
           if (!$field['deleted']) {
@@ -415,22 +417,26 @@ public function getBundleInstances($entity_type, $bundle) {
           }
         }
       }
-      unset($info['fields']);
+
+      // We can now unserialize the instances.
+      $cached_instances = $this->cacheBackend->get("field_info:bundle:instances:$entity_type:$bundle");
+      $instances = $cached_instances->data;
 
       // Store the instance definitions in the "static" cache'. Empty (or
       // non-existent) bundles are stored separately, so that they do not
       // pollute the global list returned by getInstances().
-      if ($info['instances']) {
-        $this->bundleInstances[$entity_type][$bundle] = $info['instances'];
+      if ($instances) {
+        $this->bundleInstances[$entity_type][$bundle] = $instances;
       }
       else {
         $this->emptyBundles[$entity_type][$bundle] = TRUE;
       }
-      return $info['instances'];
+      return $instances;
     }
 
     // Cache miss: collect from the definitions.
     $instances = array();
+    $fields = array();
 
     // Do not return anything for unknown entity types.
     if (entity_get_info($entity_type)) {
@@ -463,6 +469,8 @@ public function getBundleInstances($entity_type, $bundle) {
             $this->fieldsById[$field['uuid']] = $field;
             $this->fieldIdsByName[$field['field_name']] = $field['uuid'];
           }
+
+          $fields[] = $this->fieldsById[$field['uuid']];
         }
       }
     }
@@ -477,16 +485,10 @@ public function getBundleInstances($entity_type, $bundle) {
       $this->emptyBundles[$entity_type][$bundle] = TRUE;
     }
 
-    // The persistent cache additionally contains the definitions of the fields
-    // involved in the bundle.
-    $cache = array(
-      'instances' => $instances,
-      'fields' => array()
-    );
-    foreach ($instances as $instance) {
-      $cache['fields'][] = $this->fieldsById[$instance['field_id']];
-    }
-    $this->cacheBackend->set("field_info:bundle:$entity_type:$bundle", $cache, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+    // Store in the persistent cache. Fields and instances are cached in
+    // separate entries because they need to be unserialized separately.
+    $this->cacheBackend->set("field_info:bundle:fields:$entity_type:$bundle", $fields, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
+    $this->cacheBackend->set("field_info:bundle:instances:$entity_type:$bundle", $instances, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
 
     return $instances;
   }
