diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 25d4a5a..fc81260 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -62,7 +62,14 @@ protected function doCreate(array $values) {
       if (!isset($values[$this->bundleKey])) {
         throw new EntityStorageException(SafeMarkup::format('Missing bundle for entity type @type', array('@type' => $this->entityTypeId)));
       }
+
+      // Support the bundle value being passed as a plain string or as an array
+      // (for example if $values is based on the result of $entity->toArray()).
+      // Remove all wrapping arrays until we have a string.
       $bundle = $values[$this->bundleKey];
+      while (is_array($bundle)) {
+        $bundle = reset($bundle);
+      }
     }
     $entity = new $this->entityClass(array(), $this->entityTypeId, $bundle);
 
diff --git a/core/modules/serialization/src/Normalizer/EntityNormalizer.php b/core/modules/serialization/src/Normalizer/EntityNormalizer.php
index 5e81b5a..79d9c84 100644
--- a/core/modules/serialization/src/Normalizer/EntityNormalizer.php
+++ b/core/modules/serialization/src/Normalizer/EntityNormalizer.php
@@ -50,14 +50,6 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
 
     $entity_type = $this->entityManager->getDefinition($context['entity_type']);
 
-    // The bundle property behaves differently from other entity properties.
-    // i.e. the nested structure with a 'value' key does not work.
-    if ($entity_type->hasKey('bundle')) {
-      $bundle_key = $entity_type->getKey('bundle');
-      $type = $data[$bundle_key][0]['value'];
-      $data[$bundle_key] = $type;
-    }
-
     return $this->entityManager->getStorage($context['entity_type'])->create($data);
   }
 
diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/EntityNormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/EntityNormalizerTest.php
index 652c650..7e83433 100644
--- a/core/modules/serialization/tests/src/Unit/Normalizer/EntityNormalizerTest.php
+++ b/core/modules/serialization/tests/src/Unit/Normalizer/EntityNormalizerTest.php
@@ -109,31 +109,16 @@ public function testDenormalizeWithBundle() {
     );
 
     $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $entity_type->expects($this->once())
-      ->method('hasKey')
-      ->with('bundle')
-      ->will($this->returnValue(TRUE));
-    $entity_type->expects($this->once())
-      ->method('getKey')
-      ->with('bundle')
-      ->will($this->returnValue('test_type'));
 
     $this->entityManager->expects($this->once())
       ->method('getDefinition')
       ->with('test')
       ->will($this->returnValue($entity_type));
 
-    // The expected test data should have a modified test_type property.
-    $expected_test_data = array(
-      'key_1' => 'value_1',
-      'key_2' => 'value_2',
-      'test_type' => 'test_bundle',
-    );
-
     $storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
     $storage->expects($this->once())
       ->method('create')
-      ->with($expected_test_data)
+      ->with($test_data)
       ->will($this->returnValue($this->getMock('Drupal\Core\Entity\EntityInterface')));
 
     $this->entityManager->expects($this->once())
@@ -156,12 +141,6 @@ public function testDenormalizeWithNoBundle() {
     );
 
     $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $entity_type->expects($this->once())
-      ->method('hasKey')
-      ->with('bundle')
-      ->will($this->returnValue(FALSE));
-    $entity_type->expects($this->never())
-      ->method('getKey');
 
     $this->entityManager->expects($this->once())
       ->method('getDefinition')
diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityStorageBaseTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityStorageBaseTest.php
new file mode 100644
index 0000000..05e7bd7
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityStorageBaseTest.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Entity\ContentEntityStorageBase.
+ */
+
+namespace Drupal\Tests\Core\Entity;
+
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @group Entity
+ */
+class ContentEntityStorageBaseTest extends UnitTestCase {
+
+  /**
+   * The storage under test.
+   *
+   * @var \Drupal\Core\Entity\ontentEntityStorageBase|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $storage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $entity = $this->getMock('Drupal\\Core\\Entity\\EntityInterface');
+
+    $entity_type = $this->getMock('Drupal\\Core\\Entity\\EntityTypeInterface');
+
+    $entity_type->method('id')
+                ->will($this->returnValue('node'));
+
+    $map = [
+      ['id', 'nid'],
+      ['uuid', 'uuid'],
+      ['langcode', 'langcode'],
+      ['bundle', 'type'],
+    ];
+
+    $entity_type->method('getKey')
+                ->will($this->returnValueMap($map));
+
+    $entity_type->method('getClass')
+                ->will($this->returnValue(get_class($entity)));
+
+    $this->storage = $this->getMockBuilder('Drupal\\Core\\Entity\\ContentEntityStorageBase')
+                          ->setConstructorArgs([$entity_type])
+                          ->getMockForAbstractClass();
+  }
+
+  /**
+   * @dataProvider providerDoCreate
+   */
+  public function testDoCreate($values) {
+
+    $create = new \ReflectionMethod($this->storage, 'doCreate');
+    $create->setAccessible(TRUE);
+
+    $entity = $create->invoke($this->storage, $values);
+
+    foreach ($values as $key => $value) {
+      $this->assertObjectHasAttribute($key, $entity);
+
+      $this->assertEquals($value, $entity->$key);
+    }
+
+  }
+
+  /**
+   * Data provider for testDoCreate().
+   *
+   * @returns array
+   *   - Array to generate an Entity from.
+   */
+  public function providerDoCreate() {
+    return [
+      [
+        [
+          'type' => [
+            [
+              'target_id' => 'article'
+            ],
+          ],
+        ],
+      ],
+      [
+        [
+          'type' => 'article',
+        ],
+      ],
+    ];
+  }
+
+}
