diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index de1d04f..5038332 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -13,6 +13,7 @@
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Config\Entity\Exception\ConfigEntityIdLengthException;
 use Drupal\Core\Entity\Exception\UndefinedLinkTemplateException;
+use Drupal\Core\Entity\TypedData\EntityDataDefinition;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Link;
@@ -43,7 +44,7 @@
   protected $enforceIsNew;
 
   /**
-   * A typed data object wrapping this entity.
+   * The typed data adapter for the entity.
    *
    * @var \Drupal\Core\TypedData\ComplexDataInterface
    */
@@ -574,8 +575,20 @@ public function toArray() {
    */
   public function getTypedData() {
     if (!isset($this->typedData)) {
-      $class = \Drupal::typedDataManager()->getDefinition('entity')['class'];
-      $this->typedData = $class::createFromEntity($this);
+      // Create the data definition and let the typed data manager instantiate
+      // the corresponding typed data object.
+      $definition = EntityDataDefinition::create()
+        ->setEntityTypeId($this->getEntityTypeId());
+      // Some places in core create entities with fake/non-existing bundles. In
+      // such cases, setting the bundle on the definition would result in a
+      // non-existing data type, since derived 'entity:[entity_type]:[bundle]'
+      // data types are only created for bundles that actually exist. Not
+      // specifying it results in the (less specific but still valid)
+      // 'entity:[entity_type]' data type.
+      if (in_array($this->bundle(), $this->entityManager()->getBundleInfo($this->getEntityTypeId()))) {
+        $definition->setBundles([ $this->bundle() ]);
+      }
+      $this->typedData = \Drupal::typedDataManager()->create($definition, $this);
     }
     return $this->typedData;
   }
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityAdapter.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityAdapter.php
index 7e413b0..1edc74b 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityAdapter.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityAdapter.php
@@ -42,23 +42,6 @@ class EntityAdapter extends TypedData implements \IteratorAggregate, ComplexData
   protected $entity;
 
   /**
-   * Creates an instance wrapping the given entity.
-   *
-   * @param \Drupal\Core\Entity\EntityInterface|null $entity
-   *   The entity object to wrap.
-   *
-   * @return static
-   */
-  public static function createFromEntity(EntityInterface $entity) {
-    $definition = EntityDataDefinition::create()
-      ->setEntityTypeId($entity->getEntityTypeId())
-      ->setBundles([ $entity->bundle() ]);
-    $instance = new static($definition);
-    $instance->setValue($entity);
-    return $instance;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getValue() {
