diff --git a/core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php b/core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php
new file mode 100644
index 0000000..6aaa3ad
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/Definition/DerivablePluginDefinitionInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\Component\Plugin\Definition;
+
+/**
+ * Provides an interface for a derivable plugin definition.
+ *
+ * @see \Drupal\Component\Plugin\Derivative\DeriverInterface
+ */
+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/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/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
index d81360f..d472352 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Discovery/DerivativeDiscoveryDecoratorTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\Core\Plugin\Discovery;
 
+use Drupal\Component\Plugin\Definition\DerivablePluginDefinitionInterface;
 use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Tests\UnitTestCase;
 
@@ -83,6 +84,27 @@ public function testGetDerivativeFetcherWithAnnotationObjects() {
   }
 
   /**
+   * Tests the getDerivativeFetcher method with classed objects instead of arrays.
+   */
+  public function testGetDerivativeFetcherWithClassedDefinitions() {
+    $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().\
