diff --git a/core/lib/Drupal/Core/Entity/EntityAccessControlHandler.php b/core/lib/Drupal/Core/Entity/EntityAccessControlHandler.php
index ff8da23390..34a4291ae7 100644
--- a/core/lib/Drupal/Core/Entity/EntityAccessControlHandler.php
+++ b/core/lib/Drupal/Core/Entity/EntityAccessControlHandler.php
@@ -3,6 +3,7 @@
 namespace Drupal\Core\Entity;
 
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Cache\RefinableCacheableDependencyInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Language\LanguageInterface;
@@ -104,6 +105,9 @@ public function access(EntityInterface $entity, $operation, AccountInterface $ac
     if (!$return->isForbidden()) {
       $return = $return->orIf($this->checkAccess($entity, $operation, $account));
     }
+    if ($return instanceof RefinableCacheableDependencyInterface) {
+      $return->addCacheableDependency($entity);
+    }
     $result = $this->setCache($return, $cid, $operation, $langcode, $account);
     return $return_as_object ? $result : $result->isAllowed();
   }
diff --git a/core/modules/node/src/NodeAccessControlHandler.php b/core/modules/node/src/NodeAccessControlHandler.php
index a8a0bc6241..e0027dbcae 100644
--- a/core/modules/node/src/NodeAccessControlHandler.php
+++ b/core/modules/node/src/NodeAccessControlHandler.php
@@ -58,11 +58,11 @@ public function access(EntityInterface $entity, $operation, AccountInterface $ac
     $account = $this->prepareUser($account);
 
     if ($account->hasPermission('bypass node access')) {
-      $result = AccessResult::allowed()->cachePerPermissions();
+      $result = AccessResult::allowed()->cachePerPermissions()->addCacheableDependency($entity);
       return $return_as_object ? $result : $result->isAllowed();
     }
     if (!$account->hasPermission('access content')) {
-      $result = AccessResult::forbidden("The 'access content' permission is required.")->cachePerPermissions();
+      $result = AccessResult::forbidden("The 'access content' permission is required.")->cachePerPermissions()->addCacheableDependency($entity);
       return $return_as_object ? $result : $result->isAllowed();
     }
     $result = parent::access($entity, $operation, $account, TRUE)->cachePerPermissions();
diff --git a/core/modules/node/src/Tests/NodeTypeTest.php b/core/modules/node/src/Tests/NodeTypeTest.php
index 70d3ac40b5..aad3176530 100644
--- a/core/modules/node/src/Tests/NodeTypeTest.php
+++ b/core/modules/node/src/Tests/NodeTypeTest.php
@@ -99,11 +99,18 @@ public function testNodeTypeEditing() {
     $this->assertRaw('Title', 'Title field was found.');
     $this->assertRaw('Body', 'Body field was found.');
 
+    $front_page_path = Url::fromRoute('<front>')->toString();
+
     // Rename the title field.
     $edit = [
       'title_label' => 'Foo',
     ];
     $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertBreadcrumb('admin/structure/types/manage/page/fields', [
+      $front_page_path => 'Home',
+      'admin/structure/types' => 'Content types',
+      'admin/structure/types/manage/page' => 'Page',
+    ]);
 
     $this->drupalGet('node/add/page');
     $this->assertRaw('Foo', 'New title label was displayed.');
@@ -115,6 +122,11 @@ public function testNodeTypeEditing() {
       'description' => 'Lorem ipsum.',
     ];
     $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertBreadcrumb('admin/structure/types/manage/page/fields', [
+      $front_page_path => 'Home',
+      'admin/structure/types' => 'Content types',
+      'admin/structure/types/manage/page' => 'Bar',
+    ]);
 
     $this->drupalGet('node/add');
     $this->assertRaw('Bar', 'New name was displayed.');
@@ -138,7 +150,6 @@ public function testNodeTypeEditing() {
     $this->drupalPostForm('admin/structure/types/manage/page/fields/node.page.body/delete', [], t('Delete'));
     // Resave the settings for this type.
     $this->drupalPostForm('admin/structure/types/manage/page', [], t('Save content type'));
-    $front_page_path = Url::fromRoute('<front>')->toString();
     $this->assertBreadcrumb('admin/structure/types/manage/page/fields', [
       $front_page_path => 'Home',
       'admin/structure/types' => 'Content types',
diff --git a/core/modules/system/tests/src/Functional/Menu/BreadcrumbTest.php b/core/modules/system/tests/src/Functional/Menu/BreadcrumbTest.php
index 0e493e5d68..c908288b66 100644
--- a/core/modules/system/tests/src/Functional/Menu/BreadcrumbTest.php
+++ b/core/modules/system/tests/src/Functional/Menu/BreadcrumbTest.php
@@ -381,4 +381,34 @@ public function testBreadCrumbs() {
     $this->assertEscaped('<script>alert(123);</script>');
   }
 
+  /**
+   * Tests breadcrumb cacheability.
+   */
+  function testBreadcrumbCacheability() {
+    // Create an article.
+    $node = $this->drupalCreateNode([
+      'type' => 'article',
+      'title' => 'Article Foo',
+    ]);
+
+    // Edit the article's title and create a new revision.
+    $node->setTitle('Article Bar');
+    $node->setNewRevision(TRUE);
+    $node->save();
+
+    // Open the Revisions tab so the breadcrumb is cached.
+    $this->drupalGet('node/' . $node->id() . '/revisions');
+    $this->assertText('Article Bar');
+
+    // Edit the article's title again and create a new revision.
+    $node->setTitle('Article Baz');
+    $node->setNewRevision(TRUE);
+    $node->save();
+
+    // Open the Revisions tab and check the breadcrumb.
+    $this->drupalGet('node/' . $node->id() . '/revisions');
+    $this->assertNoText('Article Bar');
+    $this->assertText('Article Baz');
+  }
+
 }
