diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 89b83cf..f187603 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -182,6 +182,13 @@ class EntityType implements EntityTypeInterface {
   protected $label = '';
 
   /**
+   * The human-readable label for a collection of entities of the type.
+   *
+   * @var string
+   */
+  protected $label_collection = '';
+
+  /**
    * The indefinite singular name of the type.
    *
    * @var string
@@ -742,6 +749,17 @@ public function getLowercaseLabel() {
   /**
    * {@inheritdoc}
    */
+  public function getCollectionLabel() {
+    if (empty($this->label_collection)) {
+      $label = $this->getLabel();
+      $this->label_collection = new TranslatableMarkup('@label entities', ['@label' => $label], [], $this->getStringTranslation());
+    }
+    return $this->label_collection;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getSingularLabel() {
     if (empty($this->label_singular)) {
       $lowercase_label = $this->getLowercaseLabel();
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index c6336c9..1b9ea7b 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -628,6 +628,14 @@ public function getLabel();
   public function getLowercaseLabel();
 
   /**
+   * Gets the collection label of the entity type.
+   *
+   * @return string
+   *   The collection label.
+   */
+  public function getCollectionLabel();
+
+  /**
    * Gets the singular label of the entity type.
    *
    * @return string
diff --git a/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php b/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php
index 1ac54bb..4287bbe 100644
--- a/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php
+++ b/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php
@@ -320,7 +320,6 @@ protected function getCollectionRoute(EntityTypeInterface $entity_type) {
       $route
         ->addDefaults([
           '_entity_list' => $entity_type->id(),
-          // @todo Improve this in https://www.drupal.org/node/2767025
           '_title' => '@label entities',
           '_title_arguments' => ['@label' => $entity_type->getLabel()],
         ])
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index bdb8050..460a333 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -17,6 +17,7 @@
  * @ContentEntityType(
  *   id = "node",
  *   label = @Translation("Content"),
+ *   label_collection = @Translation("Content"),
  *   label_singular = @Translation("content item"),
  *   label_plural = @Translation("content items"),
  *   label_count = @PluralTranslation(
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
index d633afc..06cf5e1 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityTypeTest.php
@@ -319,6 +319,16 @@ public function testGetGroupLabel() {
   }
 
   /**
+   * @covers ::getCollectionLabel
+   */
+  public function testGetCollectionLabel() {
+    $translatable_label = new TranslatableMarkup('Entity test collection', [], [], $this->getStringTranslationStub());
+    $entity_type = $this->setUpEntityType(['label_collection' => $translatable_label]);
+    $entity_type->setStringTranslation($this->getStringTranslationStub());
+    $this->assertEquals('Entity test collection', $entity_type->getCollectionLabel());
+  }
+
+  /**
    * @covers ::getSingularLabel
    */
   public function testGetSingularLabel() {
