diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 62c464d..b4f43db 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -802,25 +802,27 @@ public function &__get($name) {
    * Uses default language always.
    */
   public function __set($name, $value) {
-    // Support setting values via property objects.
-    if ($value instanceof TypedDataInterface && !$value instanceof EntityInterface) {
-      $value = $value->getValue();
-    }
-    // If this is an entity field, handle it accordingly. We first check whether
-    // a field object has been already created. If not, we create one.
-    if (isset($this->fields[$name][$this->activeLangcode])) {
-      $this->fields[$name][$this->activeLangcode]->setValue($value);
-    }
-    elseif ($this->hasField($name)) {
-      $this->getTranslatedField($name, $this->activeLangcode)->setValue($value);
+    // Handle Field API fields.
+    if ($this->hasField($name)) {
+      // Support setting values via property objects.
+      if ($value instanceof TypedDataInterface && !$value instanceof EntityInterface) {
+        $value = $value->getValue();
+      }
+      // If a FieldItemList object already exists, set its value.
+      if (isset($this->fields[$name][$this->activeLangcode])) {
+        $this->fields[$name][$this->activeLangcode]->setValue($value);
+      }
+      // If not, create one.
+      else {
+        $this->getTranslatedField($name, $this->activeLangcode)->setValue($value);
+      }
     }
     // The translations array is unset when cloning the entity object, we just
     // need to restore it.
     elseif ($name == 'translations') {
       $this->translations = $value;
     }
-    // Else directly read/write plain values. That way, fields not yet converted
-    // to the entity field API can always be directly accessed.
+    // Directly write non-field values.
     else {
       $this->values[$name] = $value;
     }
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
index d62af4b..4b67f90 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
@@ -264,17 +264,22 @@ protected function doTestReadWrite($entity_type) {
     $this->assertEqual($this->entity_user->getUsername(), $entity->user_id->entity->name->value, format_string('%entity_type: User name can be read.', array('%entity_type' => $entity_type)));
     $this->assertEqual($this->entity_field_text, $entity->field_test_text->value, format_string('%entity_type: Text field can be read.', array('%entity_type' => $entity_type)));
 
-    // Test copying field values.
+    // Tests copying field values by assigning the TypedData objects.
     $entity2 = $this->createTestEntity($entity_type);
     $entity2->name = $entity->name;
     $entity2->user_id = $entity->user_id;
     $entity2->field_test_text = $entity->field_test_text;
-
-    $this->assertTrue($entity->name !== $entity2->name, format_string('%entity_type: Copying properties results in a different field object.', array('%entity_type' => $entity_type)));
+    $this->assertFalse($entity->name === $entity2->name, format_string('%entity_type: Copying properties results in a different field object.', array('%entity_type' => $entity_type)));
     $this->assertEqual($entity->name->value, $entity2->name->value, format_string('%entity_type: Name field copied.', array('%entity_type' => $entity_type)));
     $this->assertEqual($entity->user_id->target_id, $entity2->user_id->target_id, format_string('%entity_type: User id field copied.', array('%entity_type' => $entity_type)));
     $this->assertEqual($entity->field_test_text->value, $entity2->field_test_text->value, format_string('%entity_type: Text field copied.', array('%entity_type' => $entity_type)));
 
+    // Tests that assigning TypedData objects to non-field properties keeps the
+    // assigned value as is.
+    $entity2 = $this->createTestEntity($entity_type);
+    $entity2->_foo = $entity->name;
+    $this->assertTrue($entity2->_foo === $entity->name, format_string('%entity_type: Copying properties results in a different field object.', array('%entity_type' => $entity_type)));
+
     // Tests adding a value to a field item list.
     $entity->name[] = 'Another name';
     $this->assertEqual($entity->name[1]->value, 'Another name', format_string('%entity_type: List item added via [] and the first property.', array('%entity_type' => $entity_type)));
