diff --git a/core/lib/Drupal/Core/Annotation/PluralTranslation.php b/core/lib/Drupal/Core/Annotation/PluralTranslation.php
new file mode 100644
index 0000000..aea91cb
--- /dev/null
+++ b/core/lib/Drupal/Core/Annotation/PluralTranslation.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Annotation\PluralTranslation.
+ */
+
+namespace Drupal\Core\Annotation;
+
+use Drupal\Component\Annotation\AnnotationBase;
+use Drupal\Component\Annotation\AnnotationInterface;
+
+/**
+ * Defines an annotation object for strings that require plural forms. Note that
+ * the return values for both 'singular' and 'plural' keys needs to be passed to
+ * format_plural().
+ *
+ * For example, the annotation can to look like this:
+ * @code
+ *   label_count = @ PluralTranslation(
+ *     singular = "1 item",
+ *     plural = "@count items",
+ *     context = "cart_items",
+ *   ),
+ * @endcode
+ * Remove spaces after @ in your actual plugin - these are put into this sample
+ * code so that it is not recognized as annotation.
+ *
+ * Code samples that make use of this annotation class and the definition sample
+ * above:
+ * @code
+ *   // Returns: 1 item
+ *   echo $entity->entityTypeLabel(\Drupal\Core\Entity\EntityInterface::ENTITY_TYPE_LABEL_COUNT, 1);
+ *
+ *   // Returns: 5 items
+ *   echo $entity->entityTypeLabel(\Drupal\Core\Entity\EntityInterface::ENTITY_TYPE_LABEL_COUNT, 5);
+ * @endcode
+ *
+ * @Annotation
+ *
+ * @see \Drupal\Core\Entity\Entity::entityTypeLabel()
+ *
+ * @ingroup plugin_translatable
+ */
+class PluralTranslation extends AnnotationBase {
+
+  /**
+   * The context the source strings belong to.
+   *
+   * @var string
+   */
+  protected $context;
+
+  /**
+   * The string for the plural case.
+   *
+   * @var string
+   */
+  protected $plural;
+
+  /**
+   * The string for the singular case.
+   *
+   * @var string
+   */
+  protected $singular;
+
+  /**
+   * Constructs a new class instance.
+   */
+  public function __construct($values) {
+    $this->singular = $values['singular'];
+    $this->plural = $values['plural'];
+    if (isset($values['context'])) {
+      $this->context = $values['context'];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get() {
+    return array(
+      'singular' => $this->singular,
+      'plural' => $this->plural,
+      'context' => $this->context,
+    );
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 8164d7c..d5fb725 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -17,6 +17,7 @@
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
 
 /**
@@ -25,6 +26,7 @@
 abstract class Entity implements EntityInterface {
 
   use RefinableCacheableDependencyTrait;
+  use StringTranslationTrait;
 
   use DependencySerializationTrait {
     __sleep as traitSleep;
@@ -644,4 +646,25 @@ public function getConfigTarget() {
     return $this->uuid();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function entityTypeLabel($label_form = self::ENTITY_TYPE_LABEL_GENERIC, $count = NULL) {
+    $entity_type = $this->getEntityType();
+    switch ($label_form) {
+      case static::ENTITY_TYPE_LABEL_SINGULAR:
+        return $entity_type->get('label_singular');
+
+      case static::ENTITY_TYPE_LABEL_PLURAL:
+        return $entity_type->get('label_plural');
+
+      case static::ENTITY_TYPE_LABEL_COUNT:
+        return $this->formatPlural($count, $entity_type->get('label_count')['singular'], $entity_type->get('label_count')['plural']);
+
+      case static::ENTITY_TYPE_LABEL_GENERIC:
+      default:
+        return $entity_type->get('label');
+    }
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index 62a8f44..0d4a97d 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -19,6 +19,27 @@
 interface EntityInterface extends AccessibleInterface, CacheableDependencyInterface, RefinableCacheableDependencyInterface {
 
   /**
+   * Identifies the generic entity type label.
+   */
+  const ENTITY_TYPE_LABEL_GENERIC = 0;
+
+  /**
+   * Identifies the indefinite singular entity type label.
+   */
+  const ENTITY_TYPE_LABEL_SINGULAR = 1;
+
+  /**
+   * Identifies the indefinite plural entity type label.
+   */
+  const ENTITY_TYPE_LABEL_PLURAL = 2;
+
+  /**
+   * Identifies the definite singular/plural (depending on the count given)
+   * entity type label.
+   */
+  const ENTITY_TYPE_LABEL_COUNT = 3;
+
+  /**
    * Gets the entity UUID (Universally Unique Identifier).
    *
    * The UUID is guaranteed to be unique and can be used to identify an entity
@@ -497,4 +518,19 @@ public function getConfigDependencyName();
    */
   public function getConfigTarget();
 
+  /**
+   * Returns the translated label of the entity type.
+   *
+   * @param int $label_form
+   *   (optional) One of self::ENTITY_TYPE_LABEL_GENERIC,
+   *   self::ENTITY_TYPE_LABEL_SINGULAR, self:ENTITY_TYPE_LABEL_PLURAL or
+   *   self::ENTITY_TYPE_LABEL_COUNT. Defaults to the generic entity type label.
+   * @param int $count
+   *   (optional) The item count to display if the plural form was requested.
+   *
+   * @return string
+   *   The translated label.
+   */
+  public function entityTypeLabel($label_form = self::ENTITY_TYPE_LABEL_GENERIC, $count = NULL);
+
 }
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 118e862..a6e56de 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -22,6 +22,12 @@
  * @ContentEntityType(
  *   id = "node",
  *   label = @Translation("Content"),
+ *   label_singular = @Translation("content item"),
+ *   label_plural = @Translation("content items"),
+ *   label_count = @PluralTranslation(
+ *     singular = "1 content item",
+ *     plural = "@count content items"
+ *   ),
  *   bundle_label = @Translation("Content type"),
  *   handlers = {
  *     "storage" = "Drupal\node\NodeStorage",
diff --git a/core/modules/system/src/Tests/Plugin/Discovery/AnnotatedClassDiscoveryTest.php b/core/modules/system/src/Tests/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
index 6cca8f5..21123c6 100644
--- a/core/modules/system/src/Tests/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
+++ b/core/modules/system/src/Tests/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
@@ -32,6 +32,11 @@ protected function setUp() {
         'color' => 'yellow',
         'uses' => array(
           'bread' => t('Banana bread'),
+          'loaf' => array(
+            'singular' => '1 loaf',
+            'plural' => '@count loaves',
+            'context' => NULL,
+          ),
         ),
         'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Banana',
         'provider' => 'plugin_test',
diff --git a/core/modules/system/src/Tests/Plugin/Discovery/CustomDirectoryAnnotatedClassDiscoveryTest.php b/core/modules/system/src/Tests/Plugin/Discovery/CustomDirectoryAnnotatedClassDiscoveryTest.php
index 39e7caf..ab62b6f 100644
--- a/core/modules/system/src/Tests/Plugin/Discovery/CustomDirectoryAnnotatedClassDiscoveryTest.php
+++ b/core/modules/system/src/Tests/Plugin/Discovery/CustomDirectoryAnnotatedClassDiscoveryTest.php
@@ -46,6 +46,11 @@ protected function setUp() {
         'color' => 'yellow',
         'uses' => array(
           'bread' => t('Banana bread'),
+          'loaf' => array(
+            'singular' => '1 loaf',
+            'plural' => '@count loaves',
+            'context' => NULL,
+          ),
         ),
         'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Banana',
         'provider' => 'plugin_test',
diff --git a/core/modules/system/tests/modules/plugin_test/src/Plugin/plugin_test/fruit/Banana.php b/core/modules/system/tests/modules/plugin_test/src/Plugin/plugin_test/fruit/Banana.php
index 5e4d180..a87aa93 100644
--- a/core/modules/system/tests/modules/plugin_test/src/Plugin/plugin_test/fruit/Banana.php
+++ b/core/modules/system/tests/modules/plugin_test/src/Plugin/plugin_test/fruit/Banana.php
@@ -13,7 +13,11 @@
  *   label = "Banana",
  *   color = "yellow",
  *   uses = {
- *     "bread" = @Translation("Banana bread")
+ *     "bread" = @Translation("Banana bread"),
+ *     "loaf" = @PluralTranslation(
+ *       singular = "1 loaf",
+ *       plural = "@count loaves"
+ *     )
  *   }
  * )
  */
diff --git a/core/modules/views_ui/src/ViewUI.php b/core/modules/views_ui/src/ViewUI.php
index fe3198b..05762f1 100644
--- a/core/modules/views_ui/src/ViewUI.php
+++ b/core/modules/views_ui/src/ViewUI.php
@@ -1386,4 +1386,11 @@ public function addCacheTags(array $cache_tags) {
     return $this->storage->addCacheTags($cache_tags);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function entityTypeLabel($label_form = self::ENTITY_TYPE_LABEL_GENERIC, $count = NULL) {
+    return $this->storage->entityTypeLabel($label_form, $count);
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/Annotation/PluralTranslationTest.php b/core/tests/Drupal/Tests/Core/Annotation/PluralTranslationTest.php
new file mode 100644
index 0000000..2ca9ef8
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Annotation/PluralTranslationTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Annotation\PluralTranslationTest.
+ */
+
+namespace Drupal\Tests\Core\Annotation;
+
+use Drupal\Core\Annotation\PluralTranslation;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Annotation\PluralTranslation
+ * @group Annotation
+ */
+class PluralTranslationTest extends UnitTestCase {
+
+  /**
+   * @covers ::get
+   *
+   * @dataProvider providerTestGet
+   */
+  public function testGet(array $values) {
+    $annotation = new PluralTranslation($values);
+
+    $default_values = array(
+      'context' => NULL,
+    );
+    $this->assertEquals($values + $default_values, $annotation->get());
+  }
+
+  /**
+   * Provides data to self::testGet().
+   */
+  public function providerTestGet() {
+    $data = array();
+    $data[] = array(
+      array(
+        'singular' => $this->randomMachineName(),
+        'plural' => $this->randomMachineName(),
+        'context' => $this->randomMachineName(),
+      ),
+    );
+    $data[] = array(
+      array(
+        'singular' => $this->randomMachineName(),
+        'plural' => $this->randomMachineName(),
+      ),
+    );
+
+    return $data;
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php b/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
index 180fd88..5cd0d68 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/DefaultPluginManagerTest.php
@@ -49,6 +49,10 @@ protected function setUp() {
         'color' => 'yellow',
         'uses' => array(
           'bread' => 'Banana bread',
+          'loaf' => array(
+            'singular' => '1 loaf',
+            'plural' => '@count loaves',
+          ),
         ),
         'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Banana',
       ),
