diff --git a/modules/order/src/Entity/OrderItem.php b/modules/order/src/Entity/OrderItem.php
index 752bb2c4..95e3485d 100644
--- a/modules/order/src/Entity/OrderItem.php
+++ b/modules/order/src/Entity/OrderItem.php
@@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityChangedTrait;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\commerce\PurchasableEntityInterface;
 
 /**
  * Defines the order item entity class.
@@ -514,6 +515,19 @@ class OrderItem extends CommerceContentEntityBase implements OrderItemInterface
     $fields['purchased_entity'] = clone $base_field_definitions['purchased_entity'];
     if ($purchasable_entity_type) {
       $fields['purchased_entity']->setSetting('target_type', $purchasable_entity_type);
+      $entity_type = \Drupal::entityTypeManager()->getDefinition($purchasable_entity_type);
+      // If the entity type is purchasable, we assume all bundles are too.
+      // Otherwise, restrict target bundles to purchasable ones only.
+      if (!$entity_type->entityClassImplements(PurchasableEntityInterface::class)) {
+        $bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo($purchasable_entity_type);
+        $target_bundles = [];
+        foreach ($bundles as $bundle_id => $bundle_info) {
+          if (isset($bundle_info['class']) && is_subclass_of($bundle_info['class'], PurchasableEntityInterface::class)) {
+            $target_bundles[$bundle_id] = $bundle_id;
+          }
+        }
+        $fields['purchased_entity']->setSetting('handler_settings', ['target_bundles' => $target_bundles]);
+      }
     }
     else {
       // This order item type won't reference a purchasable entity. The field
diff --git a/modules/order/src/Form/OrderItemTypeForm.php b/modules/order/src/Form/OrderItemTypeForm.php
index 26c515d7..8c48036a 100644
--- a/modules/order/src/Form/OrderItemTypeForm.php
+++ b/modules/order/src/Form/OrderItemTypeForm.php
@@ -8,11 +8,45 @@ use Drupal\commerce\PurchasableEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\entity\Form\EntityDuplicateFormTrait;
+use Drupal\commerce\EntityTraitManagerInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 class OrderItemTypeForm extends CommerceBundleEntityFormBase {
 
   use EntityDuplicateFormTrait;
 
+  /**
+   * The entity type bundle info.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
+   */
+  protected $entityTypeBundleInfo;
+
+  /**
+   * Constructs a new CommerceBundleEntityFormBase object.
+   *
+   * @param \Drupal\commerce\EntityTraitManagerInterface $trait_manager
+   *   The entity trait manager.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle info.
+   */
+  public function __construct(EntityTraitManagerInterface $trait_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
+    parent::__construct($trait_manager);
+
+    $this->entityTypeBundleInfo = $entity_type_bundle_info;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.commerce_entity_trait'),
+      $container->get('entity_type.bundle.info')
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -21,12 +55,18 @@ class OrderItemTypeForm extends CommerceBundleEntityFormBase {
     $order_item_type = $this->entity;
     // Prepare the list of purchasable entity types.
     $entity_types = $this->entityTypeManager->getDefinitions();
-    $purchasable_entity_types = array_filter($entity_types, function (EntityTypeInterface $entity_type) {
-      return $entity_type->entityClassImplements(PurchasableEntityInterface::class);
-    });
-    $purchasable_entity_types = array_map(function (EntityTypeInterface $entity_type) {
-      return $entity_type->getLabel();
-    }, $purchasable_entity_types);
+    $bundle_info = $this->entityTypeBundleInfo->getAllBundleInfo();
+    $purchasable_entity_types = [];
+    // Loop over entity bundles as a bundle class could implements
+    // the PurchasableEntityInterface while the entity type does not.
+    $bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('commerce_product_variation');
+    foreach ($bundle_info as $entity_type_id => $bundles) {
+      foreach ($bundles as $bundle_id => $bundle_info) {
+        if (isset($bundle_info['class']) && is_subclass_of($bundle_info['class'], PurchasableEntityInterface::class)) {
+          $purchasable_entity_types[$entity_type_id] = $entity_types[$entity_type_id]->getLabel();
+        }
+      }
+    }
     $order_types = $this->entityTypeManager->getStorage('commerce_order_type')->loadMultiple();
 
     $form['#tree'] = TRUE;
