diff --git a/core/lib/Drupal/Core/Menu/MenuActiveTrail.php b/core/lib/Drupal/Core/Menu/MenuActiveTrail.php
index 2acb972..41cbdf1 100644
--- a/core/lib/Drupal/Core/Menu/MenuActiveTrail.php
+++ b/core/lib/Drupal/Core/Menu/MenuActiveTrail.php
@@ -74,7 +74,7 @@ protected function getCid() {
    */
   protected function resolveCacheMiss($menu_name) {
     $this->storage[$menu_name] = $this->doGetActiveTrailIds($menu_name);
-    $this->tags[] = 'config:system.menu.' . $menu_name;
+    $this->tags[] = 'menu:' . $menu_name;
     $this->persist($menu_name);
 
     return $this->storage[$menu_name];
diff --git a/core/lib/Drupal/Core/Menu/MenuLinkTree.php b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
index 090293c..17079bf 100644
--- a/core/lib/Drupal/Core/Menu/MenuLinkTree.php
+++ b/core/lib/Drupal/Core/Menu/MenuLinkTree.php
@@ -181,7 +181,7 @@ public function build(array $tree) {
       $build['#theme'] = 'menu__' . strtr($menu_name, '-', '_');
       $build['#items'] = $items;
       // Set cache tag.
-      $build['#cache']['tags'][] = 'config:system.menu.' . $menu_name;
+      $build['#cache']['tags'][] = 'menu:' . $menu_name;
     }
 
     return $build;
diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
index 659d6be..6392fde 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
@@ -191,7 +191,7 @@ public function rebuild(array $definitions) {
     $this->resetDefinitions();
     $affected_menus = $this->getMenuNames() + $before_menus;
     // Invalidate any cache tagged with any menu name.
-    $cache_tags = Cache::buildTags('config:system.menu', $affected_menus, '.');
+    $cache_tags = Cache::buildTags('menu', $affected_menus, ':');
     $this->cacheTagsInvalidator->invalidateTags($cache_tags);
     $this->resetDefinitions();
     // Every item in the cache bin should have one of the menu cache tags but it
@@ -252,7 +252,7 @@ protected function safeExecuteSelect(SelectInterface $query) {
   public function save(array $link) {
     $affected_menus = $this->doSave($link);
     $this->resetDefinitions();
-    $cache_tags = Cache::buildTags('config:system.menu', $affected_menus, '.');
+    $cache_tags = Cache::buildTags('menu', $affected_menus, ':');
     $this->cacheTagsInvalidator->invalidateTags($cache_tags);
     return $affected_menus;
   }
@@ -405,7 +405,7 @@ public function delete($id) {
       $this->updateParentalStatus($item);
       // Many children may have moved.
       $this->resetDefinitions();
-      $this->cacheTagsInvalidator->invalidateTags(['config:system.menu.' . $item['menu_name']]);
+      $this->cacheTagsInvalidator->invalidateTags(['menu:' . $item['menu_name']]);
     }
   }
 
@@ -834,7 +834,7 @@ public function loadTreeData($menu_name, MenuTreeParameters $parameters) {
       $data['tree'] = $this->doBuildTreeData($links, $parameters->activeTrail, $parameters->minDepth);
       $data['definitions'] = array();
       $data['route_names'] = $this->collectRoutesAndDefinitions($data['tree'], $data['definitions']);
-      $this->menuCacheBackend->set($tree_cid, $data, Cache::PERMANENT, ['config:system.menu.' . $menu_name]);
+      $this->menuCacheBackend->set($tree_cid, $data, Cache::PERMANENT, ['menu:' . $menu_name]);
       // The definitions were already added to $this->definitions in
       // $this->doBuildTreeData()
       unset($data['definitions']);
diff --git a/core/modules/menu_link_content/src/Tests/MenuLinkContentCacheabilityBubblingTest.php b/core/modules/menu_link_content/src/Tests/MenuLinkContentCacheabilityBubblingTest.php
index 7980c77..f18e694 100644
--- a/core/modules/menu_link_content/src/Tests/MenuLinkContentCacheabilityBubblingTest.php
+++ b/core/modules/menu_link_content/src/Tests/MenuLinkContentCacheabilityBubblingTest.php
@@ -68,7 +68,7 @@ public function testOutboundPathAndRouteProcessing() {
 
     $default_menu_cacheability = (new CacheableMetadata())
       ->setCacheMaxAge(Cache::PERMANENT)
-      ->setCacheTags(['config:system.menu.tools'])
+      ->setCacheTags(['menu:tools'])
       ->setCacheContexts(['languages:' . LanguageInterface::TYPE_INTERFACE, 'theme']);
 
     User::create(['uid' => 1, 'name' => $this->randomString()])->save();
diff --git a/core/modules/menu_ui/src/Tests/MenuCacheTagsTest.php b/core/modules/menu_ui/src/Tests/MenuCacheTagsTest.php
index adff9a0..930b409 100644
--- a/core/modules/menu_ui/src/Tests/MenuCacheTagsTest.php
+++ b/core/modules/menu_ui/src/Tests/MenuCacheTagsTest.php
@@ -53,7 +53,7 @@ public function testMenuBlock() {
       'block_view',
       'config:block_list',
       'config:block.block.' . $block->id(),
-      'config:system.menu.llama',
+      'menu:llama',
       // The cache contexts associated with the (in)accessible menu links are
       // bubbled.
       'config:user.role.anonymous',
diff --git a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
index 95bd739..79af8eb 100644
--- a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
+++ b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
@@ -101,10 +101,10 @@ function testPageCacheTags() {
       'node:' . $node_1->id(),
       'user:' . $author_1->id(),
       'config:filter.format.basic_html',
-      'config:system.menu.account',
-      'config:system.menu.tools',
-      'config:system.menu.footer',
-      'config:system.menu.main',
+      'menu:account',
+      'menu:tools',
+      'menu:footer',
+      'menu:main',
       'config:system.site',
       // FinishResponseSubscriber adds this cache tag to responses that have the
       // 'user.permissions' cache context for anonymous users.
@@ -133,10 +133,10 @@ function testPageCacheTags() {
       'node:' . $node_2->id(),
       'user:' . $author_2->id(),
       'config:filter.format.full_html',
-      'config:system.menu.account',
-      'config:system.menu.tools',
-      'config:system.menu.footer',
-      'config:system.menu.main',
+      'menu:account',
+      'menu:tools',
+      'menu:footer',
+      'menu:main',
       'config:system.site',
       'comment_list',
       'node_list',
diff --git a/core/modules/system/src/Entity/Menu.php b/core/modules/system/src/Entity/Menu.php
index fa738f3..c1d8a8c 100644
--- a/core/modules/system/src/Entity/Menu.php
+++ b/core/modules/system/src/Entity/Menu.php
@@ -18,6 +18,7 @@
  *   id = "menu",
  *   label = @Translation("Menu"),
  *   handlers = {
+ *     "storage" = "Drupal\system\MenuStorage",
  *     "access" = "Drupal\system\MenuAccessControlHandler"
  *   },
  *   admin_permission = "administer menu",
@@ -77,4 +78,14 @@ public function isLocked() {
     return (bool) $this->locked;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheTags() {
+    // Override the default cache tags to use the cache tags that are not
+    // coupled to Menu config entities (i.e. this class), to not force other
+    // parts of the menu system to couple themselves to Menu config entities.
+    return ['menu:' . $this->id()];
+  }
+
 }
diff --git a/core/modules/system/src/MenuStorage.php b/core/modules/system/src/MenuStorage.php
new file mode 100644
index 0000000..2d9ec46
--- /dev/null
+++ b/core/modules/system/src/MenuStorage.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\MenuStorage.
+ */
+
+namespace Drupal\system;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\Core\Config\Entity\ConfigEntityStorage;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Defines a storage for menu entities.
+ */
+class MenuStorage extends ConfigEntityStorage {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save(EntityInterface $entity) {
+    parent::save($entity);
+    // The menu API doesn't require one to use Menu config entities. Hence the
+    // Menu config entity should not use config-specific cache tags, but generic
+    // ones instead. That's what this code guarantees.
+    Cache::invalidateTags($entity->getCacheTags());
+  }
+
+}
diff --git a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
index aec9716..a81c94c 100644
--- a/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemMenuBlock.php
@@ -179,7 +179,7 @@ public function getCacheTags() {
     // menu block must also be re-rendered for that user, because maybe a menu
     // link that is accessible for that user has been added.
     $cache_tags = parent::getCacheTags();
-    $cache_tags[] = 'config:system.menu.' . $this->getDerivativeId();
+    $cache_tags[] = 'menu:' . $this->getDerivativeId();
     return $cache_tags;
   }
 
diff --git a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
index d699a8e..7f45076 100644
--- a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
+++ b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php
@@ -126,7 +126,7 @@ public function providerTestBuildCacheability() {
       '#cache' => [
         'contexts' => [],
         'tags' => [
-          'config:system.menu.mock',
+          'menu:mock',
         ],
         'max-age' => Cache::PERMANENT,
       ],
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 2066570..6ef1dc0 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -318,7 +318,7 @@ function _toolbar_get_subtrees_hash($langcode) {
     // Clear the cache when the 'locale' tag is deleted. This ensures a fresh
     // subtrees rendering when string translations are made.
     $role_list_cache_tags = \Drupal::entityManager()->getDefinition('user_role')->getListCacheTags();
-    \Drupal::cache('toolbar')->set($cid, $hash, Cache::PERMANENT, Cache::mergeTags(array('user:' . $uid, 'locale', 'config:system.menu.admin'), $role_list_cache_tags));
+    \Drupal::cache('toolbar')->set($cid, $hash, Cache::PERMANENT, Cache::mergeTags(array('user:' . $uid, 'locale', 'menu:admin'), $role_list_cache_tags));
   }
   return $hash;
 }
diff --git a/core/tests/Drupal/Tests/Core/Cache/CacheTest.php b/core/tests/Drupal/Tests/Core/Cache/CacheTest.php
index c2e61a1..74ac273 100644
--- a/core/tests/Drupal/Tests/Core/Cache/CacheTest.php
+++ b/core/tests/Drupal/Tests/Core/Cache/CacheTest.php
@@ -140,7 +140,7 @@ public function buildTagsProvider() {
       ['node', ['a' => NULL], ['node:']],
       ['node', ['a' => TRUE], ['node:1']],
       // Test the $glue parameter.
-      ['config:system.menu', ['menu_name'], ['config:system.menu.menu_name'], '.'],
+      ['menu', ['menu_name'], ['menu:menu_name'], ':'],
     ];
   }
 
