diff --git a/core/core.services.yml b/core/core.services.yml
index 022fa7e..1cfed64 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -117,6 +117,8 @@ services:
   config.typed:
     class: Drupal\Core\Config\TypedConfigManager
     arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery']
+    tags:
+      - { name: plugin_manager_cache_clear }
   context.handler:
     class: Drupal\Core\Plugin\Context\ContextHandler
     arguments: ['@typed_data_manager']
diff --git a/core/lib/Drupal/Core/Config/Schema/ConfigSchemaDiscovery.php b/core/lib/Drupal/Core/Config/Schema/ConfigSchemaDiscovery.php
new file mode 100644
index 0000000..53330ec
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/Schema/ConfigSchemaDiscovery.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Config\Schema\ConfigSchemaDiscovery.
+ */
+
+namespace Drupal\Core\Config\Schema;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Plugin\Discovery\DiscoveryTrait;
+use Drupal\Core\Config\StorageInterface;
+
+/**
+ * Allows YAML files to define config schema types.
+ */
+class ConfigSchemaDiscovery implements DiscoveryInterface {
+
+  use DiscoveryTrait;
+
+  /**
+   * A storage instance for reading configuration schema data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $schemaStorage;
+
+  /**
+   * Constructs a ConfigSchemaDiscovery object.
+   *
+   * @param $schema_storage
+   *   The storage object to use for reading schema data.
+   */
+  function __construct(StorageInterface $schema_storage) {
+    $this->schemaStorage = $schema_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinitions() {
+    $definitions = array();
+    foreach ($this->schemaStorage->readMultiple($this->schemaStorage->listAll()) as $schema) {
+      foreach ($schema as $type => $definition) {
+        $definitions[$type] = $definition;
+      }
+    }
+    return $definitions;
+  }
+}
diff --git a/core/lib/Drupal/Core/Config/TypedConfigManager.php b/core/lib/Drupal/Core/Config/TypedConfigManager.php
index ba3f353..b520dd8 100644
--- a/core/lib/Drupal/Core/Config/TypedConfigManager.php
+++ b/core/lib/Drupal/Core/Config/TypedConfigManager.php
@@ -9,6 +9,8 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\Schema\ConfigSchemaDiscovery;
+use Drupal\Core\Plugin\Discovery\AlterDecorator;
 use Drupal\Core\TypedData\TypedDataManager;
 
 /**
@@ -17,13 +19,6 @@
 class TypedConfigManager extends TypedDataManager implements TypedConfigManagerInterface {
 
   /**
-   * The cache ID for the definitions.
-   *
-   * @var string
-   */
-  const CACHE_ID = 'typed_config_definitions';
-
-  /**
    * A storage instance for reading configuration data.
    *
    * @var \Drupal\Core\Config\StorageInterface
@@ -45,13 +40,6 @@ class TypedConfigManager extends TypedDataManager implements TypedConfigManagerI
   protected $definitions;
 
   /**
-   * Cache backend for the definitions.
-   *
-   * @var \Drupal\Core\Cache\CacheBackendInterface
-   */
-  protected $cache;
-
-  /**
    * Creates a new typed configuration manager.
    *
    * @param \Drupal\Core\Config\StorageInterface $configStorage
@@ -64,7 +52,8 @@ class TypedConfigManager extends TypedDataManager implements TypedConfigManagerI
   public function __construct(StorageInterface $configStorage, StorageInterface $schemaStorage, CacheBackendInterface $cache) {
     $this->configStorage = $configStorage;
     $this->schemaStorage = $schemaStorage;
-    $this->cache = $cache;
+    $this->setCacheBackend($cache, 'typed_config_definitions');
+    $this->discovery = new AlterDecorator(new ConfigSchemaDiscovery($schemaStorage), 'config_schema_info');
   }
 
   /**
@@ -150,31 +139,9 @@ public function getDefinition($base_plugin_id, $exception_on_invalid = TRUE) {
   /**
    * {@inheritdoc}
    */
-  public function getDefinitions() {
-    if (!isset($this->definitions)) {
-      if ($cache = $this->cache->get($this::CACHE_ID)) {
-        $this->definitions = $cache->data;
-      }
-      else {
-        $this->definitions = array();
-        foreach ($this->schemaStorage->readMultiple($this->schemaStorage->listAll()) as $schema) {
-          foreach ($schema as $type => $definition) {
-            $this->definitions[$type] = $definition;
-          }
-        }
-        $this->cache->set($this::CACHE_ID, $this->definitions);
-      }
-    }
-    return $this->definitions;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function clearCachedDefinitions() {
-    $this->definitions = NULL;
     $this->schemaStorage->reset();
-    $this->cache->delete($this::CACHE_ID);
+    parent::clearCachedDefinitions();
   }
 
   /**
diff --git a/core/modules/config_translation/config_translation.api.php b/core/modules/config_translation/config_translation.api.php
index a7db185..27c89b1 100644
--- a/core/modules/config_translation/config_translation.api.php
+++ b/core/modules/config_translation/config_translation.api.php
@@ -89,24 +89,5 @@ function hook_config_translation_info_alter(&$info) {
 }
 
 /**
- * Alter config typed data definitions.
- *
- * Used to automatically generate translation forms, you can alter the typed
- * data types representing each configuration schema type to change default
- * labels or form element renderers.
- *
- * @param $definitions
- *   Associative array of configuration type definitions keyed by schema type
- *   names. The elements are themselves array with information about the type.
- */
-function hook_config_translation_type_info_alter(&$definitions) {
-  // Enhance the text and date type definitions with classes to generate proper
-  // form elements in ConfigTranslationFormBase. Other translatable types will
-  // appear as a one line textfield.
-  $definitions['text']['form_element_class'] = '\Drupal\config_translation\FormElement\Textarea';
-  $definitions['date_format']['form_element_class'] = '\Drupal\config_translation\FormElement\DateFormat';
-}
-
-/**
  * @} End of "addtogroup hooks".
  */
diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index b128931..b0565b7 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -192,9 +192,9 @@ function config_translation_entity_operation(EntityInterface $entity) {
 }
 
 /**
- * Implements hook_config_translation_type_info_alter().
+ * Implements hook_config_schema_info_alter().
  */
-function config_translation_config_translation_type_info_alter(&$definitions) {
+function config_translation_config_schema_info_alter(&$definitions) {
   // Enhance the text and date type definitions with classes to generate proper
   // form elements in ConfigTranslationFormBase. Other translatable types will
   // appear as a one line textfield.
diff --git a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
index 5b6125a..a14c585 100644
--- a/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
+++ b/core/modules/config_translation/src/Form/ConfigTranslationFormBase.php
@@ -49,13 +49,6 @@
   protected $localeStorage;
 
   /**
-   * The module handler to invoke the alter hook.
-   *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface
-   */
-  protected $moduleHandler;
-
-  /**
    * The mapper for configuration translation.
    *
    * @var \Drupal\config_translation\ConfigMapperInterface
@@ -99,14 +92,11 @@
    *   The configuration mapper manager.
    * @param \Drupal\locale\StringStorageInterface $locale_storage
    *   The translation storage object.
-   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   *   The module handler to invoke the alter hook.
    */
-  public function __construct(TypedConfigManagerInterface $typed_config_manager, ConfigMapperManagerInterface $config_mapper_manager, StringStorageInterface $locale_storage, ModuleHandlerInterface $module_handler, ConfigurableLanguageManagerInterface $language_manager) {
+  public function __construct(TypedConfigManagerInterface $typed_config_manager, ConfigMapperManagerInterface $config_mapper_manager, StringStorageInterface $locale_storage, ConfigurableLanguageManagerInterface $language_manager) {
     $this->typedConfigManager = $typed_config_manager;
     $this->configMapperManager = $config_mapper_manager;
     $this->localeStorage = $locale_storage;
-    $this->moduleHandler = $module_handler;
     $this->languageManager = $language_manager;
   }
 
@@ -118,7 +108,6 @@ public static function create(ContainerInterface $container) {
       $container->get('config.typed'),
       $container->get('plugin.manager.config_translation.mapper'),
       $container->get('locale.storage'),
-      $container->get('module_handler'),
       $container->get('language_manager')
     );
   }
@@ -311,13 +300,6 @@ protected function buildConfigForm(Element $schema, $config_data, $base_config_d
       else {
         $definition = $element->getDataDefinition();
 
-        // Invoke hook_config_translation_type_info_alter() implementations to
-        // alter the configuration types.
-        $definitions = array(
-          $definition['type'] => &$definition,
-        );
-        $this->moduleHandler->alter('config_translation_type_info', $definitions);
-
         // Create form element only for translatable items.
         if (!isset($definition['translatable']) || !isset($definition['type'])) {
           continue;
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 2eef874..f0b21a0 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -2833,6 +2833,25 @@ function hook_config_import_steps_alter(&$sync_steps, \Drupal\Core\Config\Config
 }
 
 /**
+ * Alter config typed data definitions.
+ *
+ * For example you can alter the typed data types representing each
+ * configuration schema type to change default labels or form element renderers
+ * used for configuration translation.
+ *
+ * @param $definitions
+ *   Associative array of configuration type definitions keyed by schema type
+ *   names. The elements are themselves array with information about the type.
+ */
+function hook_config_schema_info_alter(&$definitions) {
+  // Enhance the text and date type definitions with classes to generate proper
+  // form elements in ConfigTranslationFormBase. Other translatable types will
+  // appear as a one line textfield.
+  $definitions['text']['form_element_class'] = '\Drupal\config_translation\FormElement\Textarea';
+  $definitions['date_format']['form_element_class'] = '\Drupal\config_translation\FormElement\DateFormat';
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
 
