diff --git a/core/lib/Drupal/Component/Plugin/Definition/PluginDefinition.php b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinition.php
index ed1ac91..8318616 100644
--- a/core/lib/Drupal/Component/Plugin/Definition/PluginDefinition.php
+++ b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinition.php
@@ -29,6 +29,13 @@ class PluginDefinition implements PluginDefinitionInterface {
   protected $provider;
 
   /**
+   * The name of the deriver of this layout definition, if any.
+   *
+   * @var string|null
+   */
+  protected $deriver;
+
+  /**
    * {@inheritdoc}
    */
   public function id() {
@@ -57,4 +64,19 @@ public function getProvider() {
     return $this->provider;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDeriver() {
+    return $this->deriver;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setDeriver($deriver) {
+    $this->deriver = $deriver;
+    return $this;
+  }
+
 }
diff --git a/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php
index 4599a0b..943c983 100644
--- a/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php
+++ b/core/lib/Drupal/Component/Plugin/Definition/PluginDefinitionInterface.php
@@ -51,4 +51,23 @@ public function getClass();
    */
   public function getProvider();
 
+  /**
+   * Gets the name of the deriver of this plugin definition, if it exists.
+   *
+   * @return string|null
+   *   Either the deriver class name, or NULL if the plugin is not derived.
+   */
+  public function getDeriver();
+
+  /**
+   * Sets the deriver of this plugin definition.
+   *
+   * @param string|null $deriver
+   *   Either the name of a class that implements
+   *   \Drupal\Component\Plugin\Derivative\DeriverInterface, or NULL.
+   *
+   * @return $this
+   */
+  public function setDeriver($deriver);
+
 }
diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 2028f40..3ea6141 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\PluginDefinitionInterface;
 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 PluginDefinitionInterface) {
+      $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/DerivablePluginDefinitionInterface.php b/core/lib/Drupal/Core/Layout/DerivablePluginDefinitionInterface.php
deleted file mode 100644
index 3d24b9d..0000000
--- a/core/lib/Drupal/Core/Layout/DerivablePluginDefinitionInterface.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace Drupal\Core\Layout;
-
-use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
-
-/**
- * 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 {
-
-  /**
-   * Gets the name of the deriver of this plugin definition, if it exists.
-   *
-   * @return string|null
-   *   Either the deriver class name, or NULL if the plugin is not derived.
-   */
-  public function getDeriver();
-
-  /**
-   * Sets the deriver of this plugin definition.
-   *
-   * @param string|null $deriver
-   *   Either the name of a class that implements
-   *   \Drupal\Component\Plugin\Derivative\DeriverInterface, or NULL.
-   *
-   * @return $this
-   */
-  public function setDeriver($deriver);
-
-}
diff --git a/core/lib/Drupal/Core/Layout/LayoutDefinition.php b/core/lib/Drupal/Core/Layout/LayoutDefinition.php
index a319313..a92ac82 100644
--- a/core/lib/Drupal/Core/Layout/LayoutDefinition.php
+++ b/core/lib/Drupal/Core/Layout/LayoutDefinition.php
@@ -13,14 +13,7 @@
  *   experimental modules and development releases of contributed modules.
  *   See https://www.drupal.org/core/experimental for more information.
  */
-class LayoutDefinition extends PluginDefinition implements PluginDefinitionInterface, DerivablePluginDefinitionInterface {
-
-  /**
-   * The name of the deriver of this layout definition, if any.
-   *
-   * @var string|null
-   */
-  protected $deriver;
+class LayoutDefinition extends PluginDefinition implements PluginDefinitionInterface {
 
   /**
    * The dependencies of this layout definition.
@@ -477,19 +470,4 @@ public function setConfigDependencies(array $config_dependencies) {
     return $this;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getDeriver() {
-    return $this->deriver;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setDeriver($deriver) {
-    $this->deriver = $deriver;
-    return $this;
-  }
-
 }
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..2c63fda 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\PluginDefinitionInterface;
 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(PluginDefinitionInterface::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(PluginDefinitionInterface::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().\
