diff --git a/core/lib/Drupal/Core/Layout/DerivablePluginDefinitionInterface.php b/core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php
similarity index 58%
rename from core/lib/Drupal/Core/Layout/DerivablePluginDefinitionInterface.php
rename to core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php
index 3d24b9d..6aaa3ad 100644
--- a/core/lib/Drupal/Core/Layout/DerivablePluginDefinitionInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php
@@ -1,22 +1,11 @@
 <?php
 
-namespace Drupal\Core\Layout;
-
-use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
+namespace Drupal\Component\Plugin\Definition;
 
 /**
  * Provides an interface for a derivable plugin definition.
  *
  * @see \Drupal\Component\Plugin\Derivative\DeriverInterface
- * @see \Drupal\Core\Layout\ObjectDefinitionContainerDerivativeDiscoveryDecorator
- *
- * @internal
- *   The layout system is currently experimental and should only be leveraged by
- *   experimental modules and development releases of contributed modules.
- *   See https://www.drupal.org/core/experimental for more information.
- *
- * @todo Move into \Drupal\Component\Plugin\Definition in
- *   https://www.drupal.org/node/2821189.
  */
 interface DerivablePluginDefinitionInterface extends PluginDefinitionInterface {
 
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 2028f40..405a802 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Component\Plugin\Discovery;
 
+use Drupal\Component\Plugin\Definition\DerivablePluginDefinitionInterface;
 use Drupal\Component\Plugin\Exception\InvalidDeriverException;
 
 /**
@@ -203,7 +204,13 @@ protected function getDeriver($base_plugin_id, $base_definition) {
    */
   protected function getDeriverClass($base_definition) {
     $class = NULL;
-    if ((is_array($base_definition) || ($base_definition = (array) $base_definition)) && (isset($base_definition['deriver']) && $class = $base_definition['deriver'])) {
+    if ($base_definition instanceof DerivablePluginDefinitionInterface) {
+      $class = $base_definition->getDeriver();
+    }
+    if ((is_array($base_definition) || ($base_definition = (array) $base_definition)) && (isset($base_definition['deriver']))) {
+      $class = $base_definition['deriver'];
+    }
+    if ($class) {
       if (!class_exists($class)) {
         throw new InvalidDeriverException(sprintf('Plugin (%s) deriver "%s" does not exist.', $base_definition['id'], $class));
       }
diff --git a/core/lib/Drupal/Core/Layout/LayoutPluginManager.php b/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
index 8ff11eb..a0703d6 100644
--- a/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
+++ b/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Layout;
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
@@ -64,7 +65,7 @@ protected function getDiscovery() {
       $discovery = new AnnotatedClassDiscovery($this->subdir, $this->namespaces, $this->pluginDefinitionAnnotationName, $this->additionalAnnotationNamespaces);
       $discovery = new YamlDiscoveryDecorator($discovery, 'layouts', $this->moduleHandler->getModuleDirectories() + $this->themeHandler->getThemeDirectories());
       $discovery = new ObjectDefinitionDiscoveryDecorator($discovery, $this->pluginDefinitionAnnotationName);
-      $discovery = new ObjectDefinitionContainerDerivativeDiscoveryDecorator($discovery);
+      $discovery = new DerivativeDiscoveryDecorator($discovery);
       $this->discovery = $discovery;
     }
     return $this->discovery;
diff --git a/core/lib/Drupal/Core/Layout/ObjectDefinitionContainerDerivativeDiscoveryDecorator.php b/core/lib/Drupal/Core/Layout/ObjectDefinitionContainerDerivativeDiscoveryDecorator.php
deleted file mode 100644
index 02ecfb0..0000000
--- a/core/lib/Drupal/Core/Layout/ObjectDefinitionContainerDerivativeDiscoveryDecorator.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace Drupal\Core\Layout;
-
-use Drupal\Component\Plugin\Exception\InvalidDeriverException;
-use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator;
-
-/**
- * Allows object-based definitions to use derivatives.
- *
- * @internal
- *   The layout system is currently experimental and should only be leveraged by
- *   experimental modules and development releases of contributed modules.
- *   See https://www.drupal.org/core/experimental for more information.
- *
- * @todo In https://www.drupal.org/node/2821189 merge into
- *    \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator.
- */
-class ObjectDefinitionContainerDerivativeDiscoveryDecorator extends ContainerDerivativeDiscoveryDecorator {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getDeriverClass($base_definition) {
-    $class = NULL;
-    if ($base_definition instanceof DerivablePluginDefinitionInterface && $class = $base_definition->getDeriver()) {
-      if (!class_exists($class)) {
-        throw new InvalidDeriverException(sprintf('Plugin (%s) deriver "%s" does not exist.', $base_definition['id'], $class));
-      }
-      if (!is_subclass_of($class, '\Drupal\Component\Plugin\Derivative\DeriverInterface')) {
-        throw new InvalidDeriverException(sprintf('Plugin (%s) deriver "%s" must implement \Drupal\Component\Plugin\Derivative\DeriverInterface.', $base_definition['id'], $class));
-      }
-    }
-    return $class;
-  }
-
-}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
index d81360f..a243f35 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
@@ -2,12 +2,15 @@
 
 namespace Drupal\Tests\Core\Plugin\Discovery;
 
+use Drupal\Component\Plugin\Definition\DerivablePluginDefinitionInterface;
 use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Tests\UnitTestCase;
 
 /**
  * Unit tests for the derivative discovery decorator.
  *
+ * @coversDefaultClass \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator
+ *
  * @group Plugin
  */
 class DerivativeDiscoveryDecoratorTest extends UnitTestCase {
@@ -83,6 +86,29 @@ public function testGetDerivativeFetcherWithAnnotationObjects() {
   }
 
   /**
+   * Tests getDeriverClass with classed objects instead of arrays.
+   *
+   * @covers ::getDeriverClass
+   */
+  public function testGetDeriverClassWithClassedDefinitions() {
+    $definitions = array();
+    $definition = $this->prophesize(DerivablePluginDefinitionInterface::class);
+    $definition->getDeriver()->willReturn(TestDerivativeDiscoveryWithObject::class);
+    $definitions['non_container_aware_discovery'] = $definition->reveal();
+
+    $this->discoveryMain->expects($this->any())
+      ->method('getDefinitions')
+      ->will($this->returnValue($definitions));
+
+    $discovery = new DerivativeDiscoveryDecorator($this->discoveryMain);
+    $definitions = $discovery->getDefinitions();
+
+    // Ensure that both test derivatives got added.
+    $this->assertContainsOnlyInstancesOf(DerivablePluginDefinitionInterface::class, $definitions);
+    $this->assertEquals(['non_container_aware_discovery:test_discovery_0', 'non_container_aware_discovery:test_discovery_1'], array_keys($definitions));
+  }
+
+  /**
    * Tests the getDerivativeFetcher method with a non-existent class.
    *
    * @see \Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator::getDeriver().\
