diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc
index 55c89ae9f9..ee15f4b008 100644
--- a/core/modules/system/system.tokens.inc
+++ b/core/modules/system/system.tokens.inc
@@ -62,6 +62,19 @@ function system_token_info() {
     'name' => t("Long format"),
     'description' => t("A date in 'long' format. (%date)", ['%date' => format_date(REQUEST_TIME, 'long')]),
   ];
+
+  /** @var \Drupal\Core\Datetime\DateFormatInterface[] $date_formats */
+  $date_formats = \Drupal::entityTypeManager()->getStorage('date_format')->loadMultiple();
+  foreach ($date_formats as $date_format) {
+    $date[$date_format->id()] = [
+      'name' => $date_format->label(),
+      'description' => t("A date in the %name format. (%date)", [
+        '%name' => $date_format->label(),
+        '%date' => format_date(REQUEST_TIME, $date_format->id()),
+      ]),
+    ];
+  }
+
   $date['custom'] = [
     'name' => t("Custom format"),
     'description' => t('A date in a custom format. See <a href="http://php.net/manual/function.date.php">the PHP documentation</a> for details.'),
@@ -161,17 +174,17 @@ function system_tokens($type, $tokens, array $data, array $options, BubbleableMe
     else {
       $date = $data['date'];
     }
-
+    /** @var \Drupal\Core\Entity\EntityStorageInterface $date_format_storage */
+    $date_format_storage = \Drupal::entityTypeManager()->getStorage('date_format');
     foreach ($tokens as $name => $original) {
+      // Date type token replacement.
+      $date_format = $date_format_storage->load($name);
+      if ($date_format) {
+        $bubbleable_metadata->addCacheableDependency($date_format);
+        $replacements[$original] = format_date($date, $name, '', NULL, $langcode);
+        continue;
+      }
       switch ($name) {
-        case 'short':
-        case 'medium':
-        case 'long':
-          $date_format = DateFormat::load($name);
-          $bubbleable_metadata->addCacheableDependency($date_format);
-          $replacements[$original] = format_date($date, $name, '', NULL, $langcode);
-          break;
-
         case 'since':
           $replacements[$original] = \Drupal::service('date.formatter')->formatTimeDiffSince($date, ['langcode' => $langcode]);
           $bubbleable_metadata->setCacheMaxAge(0);
