diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 95247ad..fe60ede 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -40,6 +40,29 @@ function book_help($path, $arg) {
 }
 
 /**
+ * Implements hook_entity_bundle_info().
+ */
+function book_entity_bundle_info() {
+  $bundles['menu_link']['book-toc'] = array(
+    'label' => t('Book'),
+    'translatable' => FALSE,
+  );
+  return $bundles;
+}
+
+/**
+ * Implements hook_TYPE_load().
+ */
+function book_menu_link_load($entities) {
+  foreach ($entities as $entity) {
+    // Change the bundle of menu links related to a book.
+    if (strpos($entity->menu_name, 'book-toc-') !== FALSE) {
+      $entity->type = 'book-toc';
+    }
+  }
+}
+
+/**
  * Implements hook_theme().
  */
 function book_theme() {
diff --git a/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php b/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php
index 6c3ed1a..106ac64 100644
--- a/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php
+++ b/core/modules/menu/lib/Drupal/menu/Tests/MenuTest.php
@@ -333,6 +333,30 @@ public function testBlockContextualLinks() {
   }
 
   /**
+   * Tests menu link bundles.
+   */
+  public function testMenuBundles() {
+    $this->drupalLogin($this->big_user);
+    $menu = $this->addCustomMenu();
+    $bundles = entity_get_bundles('menu_link');
+    $this->assertTrue($bundles[$menu->id()]);
+    $menus = menu_list_system_menus();
+    $menus[$menu->id()] = $menu->label();
+    ksort($menus);
+    $this->assertIdentical(array_keys($bundles), array_keys($menus));
+
+    // Test if moving a menu link between menus changes the bundle.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $item = $this->addMenuLink(0, 'node/' . $node->nid, 'tools');
+    $this->moveMenuLink($item, 0, $menu->id());
+    $this->assertEqual($item->bundle(), 'tools', 'Menu link bundle matches the menu');
+
+    $moved_item = entity_load('menu_link', $item->id(), TRUE);
+    $this->assertNotEqual($moved_item->bundle(), $item->bundle(), 'Menu link bundle was changed');
+    $this->assertEqual($moved_item->bundle(), $menu->id(), 'Menu link bundle matches the menu');
+  }
+
+  /**
    * Add a menu link using the menu module UI.
    *
    * @param integer $plid Parent menu link id.
diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module
index 1b43a4e..14c41b0 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -153,6 +153,22 @@ function menu_entity_info_alter(&$entity_info) {
 }
 
 /**
+ * Implements hook_entity_bundle_info().
+ */
+function menu_entity_bundle_info() {
+  $bundles = array();
+  $config_names = config_get_storage_names_with_prefix('menu.menu.');
+  foreach ($config_names as $config_name) {
+    $config = config($config_name);
+    $bundles['menu_link'][$config->get('id')] = array(
+      'label' => $config->get('label'),
+    );
+  }
+
+  return $bundles;
+}
+
+/**
  * Entity URI callback.
  *
  * @param \Drupal\system\Plugin\Core\Entity\Menu $menu
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
index a08d02a..6c0a180 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -104,6 +104,9 @@ protected function attachLoad(&$menu_links, $load_revision = FALSE) {
       // Use the weight property from the menu link.
       $menu_link->router_item['weight'] = $menu_link->weight;
 
+      // By default use the menu_name as type.
+      $menu_link->type = $menu_link->menu_name;
+
       // For all links that have an associated route, load the route object now
       // and save it on the object. That way we avoid a select N+1 problem later.
       if ($menu_link->route_name) {
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
index af4c799..ac548e1 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
@@ -35,7 +35,11 @@
  *   entity_keys = {
  *     "id" = "mlid",
  *     "label" = "link_title",
- *     "uuid" = "uuid"
+ *     "uuid" = "uuid",
+ *     "bundle" = "type"
+ *   },
+ *   bundle_keys = {
+ *     "bundle" = "type"
  *   }
  * )
  */
@@ -49,6 +53,13 @@ class MenuLink extends Entity implements \ArrayAccess, MenuLinkInterface {
   public $menu_name = 'tools';
 
   /**
+   * The link's type.
+   *
+   * @var string
+   */
+  public $type = 'tools';
+
+  /**
    * The menu link ID.
    *
    * @var int
@@ -254,6 +265,18 @@ public function id() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function bundle() {
+    // If the bundle key is set - use it.
+    $entity_info = $this->entityInfo();
+    if (!empty($entity_info['entity_keys']['bundle'])) {
+      return $this->{$entity_info['entity_keys']['bundle']};
+    }
+    return parent::bundle();
+  }
+
+  /**
    * Overrides Entity::createDuplicate().
    */
   public function createDuplicate() {
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index 2da3d26..58fc192 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -39,6 +39,29 @@ function shortcut_help($path, $arg) {
 }
 
 /**
+ * Implements hook_entity_bundle_info().
+ */
+function shortcut_entity_bundle_info() {
+  $bundles['menu_link']['shortcut'] = array(
+    'label' => t('Shortcut'),
+    'translatable' => FALSE,
+  );
+  return $bundles;
+}
+
+/**
+ * Implements hook_TYPE_load().
+ */
+function shortcut_menu_link_load($entities) {
+  foreach ($entities as $entity) {
+    // Change the bundle of menu links related to a shortcut.
+    if (strpos($entity->menu_name, 'shortcut-') !== FALSE) {
+      $entity->type = 'shortcut';
+    }
+  }
+}
+
+/**
  * Implements hook_permission().
  */
 function shortcut_permission() {
