diff --git a/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php b/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php
new file mode 100644
index 0000000..772b074
--- /dev/null
+++ b/core/modules/content_moderation/src/Entity/EntityUniqueLabelTrait.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\content_moderation\Entity;
+
+/**
+ * Provides a trait for selecting providing unique labels.
+ */
+trait EntityUniqueLabelTrait {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getNonUniqueLabels() {
+    $labels = [];
+
+    foreach (static::loadMultiple() as $arg) {
+      $label = $arg->label(FALSE);
+      $labels[$label] = isset($labels[$label]);
+    }
+
+    return array_filter($labels);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function label($unique = TRUE) {
+    $label = parent::label();
+    if ($unique) {
+      if (isset(static::getNonUniqueLabels()[$label])) {
+        return $label . ' (' . $this->id() . ')';
+      }
+    }
+    return $label;
+  }
+
+}
diff --git a/core/modules/content_moderation/src/Entity/ModerationState.php b/core/modules/content_moderation/src/Entity/ModerationState.php
index 0522e7d..09e95fd 100644
--- a/core/modules/content_moderation/src/Entity/ModerationState.php
+++ b/core/modules/content_moderation/src/Entity/ModerationState.php
@@ -42,6 +42,7 @@
  * )
  */
 class ModerationState extends ConfigEntityBase implements ModerationStateInterface {
+  use EntityUniqueLabelTrait;
 
   /**
    * The Moderation state ID.
diff --git a/core/modules/content_moderation/src/Entity/ModerationStateTransition.php b/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
index 99dbf93..0d31f6f 100644
--- a/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
+++ b/core/modules/content_moderation/src/Entity/ModerationStateTransition.php
@@ -35,6 +35,7 @@
  * )
  */
 class ModerationStateTransition extends ConfigEntityBase implements ModerationStateTransitionInterface {
+  use EntityUniqueLabelTrait;
 
   /**
    * The Moderation state transition ID.
diff --git a/core/modules/content_moderation/src/Form/ModerationStateForm.php b/core/modules/content_moderation/src/Form/ModerationStateForm.php
index 32d7a48..648a87b 100644
--- a/core/modules/content_moderation/src/Form/ModerationStateForm.php
+++ b/core/modules/content_moderation/src/Form/ModerationStateForm.php
@@ -23,7 +23,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
       '#maxlength' => 255,
-      '#default_value' => $moderation_state->label(),
+      '#default_value' => $moderation_state->label(FALSE),
       '#description' => $this->t('Label for the Moderation state.'),
       '#required' => TRUE,
     );
diff --git a/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php b/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
index 8322c18..3a2bedb 100644
--- a/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
+++ b/core/modules/content_moderation/src/Form/ModerationStateTransitionForm.php
@@ -61,7 +61,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
       '#maxlength' => 255,
-      '#default_value' => $moderation_state_transition->label(),
+      '#default_value' => $moderation_state_transition->label(FALSE),
       '#description' => $this->t('Label for the Moderation state transition.'),
       '#required' => TRUE,
     ];
diff --git a/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php b/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
index 577283e..86725b5 100644
--- a/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
+++ b/core/modules/content_moderation/src/ModerationStateTransitionListBuilder.php
@@ -82,7 +82,7 @@ public function buildHeader() {
    */
   public function buildRow(EntityInterface $entity) {
     $row['to']['#markup'] = $this->stateStorage->load($entity->getToState())->label();
-    $row['label'] = $entity->label();
+    $row['label'] = $entity->label(FALSE);
     $row['roles']['#markup'] = implode(', ', user_role_names(FALSE, 'use ' . $entity->id() . ' transition'));
 
     return $row + parent::buildRow($entity);
diff --git a/core/modules/content_moderation/src/Permissions.php b/core/modules/content_moderation/src/Permissions.php
index 027684c..a0cef5b 100644
--- a/core/modules/content_moderation/src/Permissions.php
+++ b/core/modules/content_moderation/src/Permissions.php
@@ -28,7 +28,7 @@ public function transitionPermissions() {
     foreach (ModerationStateTransition::loadMultiple() as $id => $transition) {
       $perms['use ' . $id . ' transition'] = [
         'title' => $this->t('Use the %transition_name transition', [
-          '%transition_name' => $transition->label(),
+          '%transition_name' => $transition->label(FALSE),
         ]),
         'description' => $this->t('Move content from %from state to %to state.', [
           '%from' => $states[$transition->getFromState()]->label(),
diff --git a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
index d6dc89d..1807bf5 100644
--- a/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
+++ b/core/modules/content_moderation/src/Plugin/Field/FieldWidget/ModerationStateWidget.php
@@ -163,7 +163,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $target_states = [];
     /** @var \Drupal\content_moderation\Entity\ModerationStateTransition $transition */
     foreach ($transitions as $transition) {
-      $target_states[$transition->getToState()] = $transition->label();
+      $target_states[$transition->getToState()] = $transition->label(FALSE);
     }
 
     // @todo https://www.drupal.org/node/2779933 write a test for this.
