diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index 24b1de5fa0..bafdb7708c 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -104,6 +104,19 @@ public function form(FieldItemListInterface $items, array &$form, FormStateInter
       $elements = $this->formMultipleElements($items, $form, $form_state);
     }
 
+    // Allow modules to alter the field multi-value widget form element.
+    // This hook can also be used for single-value fields.
+    $context = [
+      'form' => $form,
+      'widget' => $this,
+      'items' => $items,
+      'default' => $this->isDefaultValueWidget($form_state),
+    ];
+    \Drupal::moduleHandler()->alter([
+      'field_widget_multivalue_form',
+      'field_widget_multivalue_' . $this->getPluginId() . '_form',
+    ], $elements, $form_state, $context);
+
     // Populate the 'array_parents' information in $form_state->get('field')
     // after the form is built, so that we catch changes in the form structure
     // performed in alter() hooks.
@@ -241,19 +254,6 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f
           ],
         ];
       }
-
-      // Allow modules to alter the field multi-value widget form element.
-      // This hook can also be used for single-value fields.
-      $context = [
-        'form' => $form,
-        'widget' => $this,
-        'items' => $items,
-        'default' => $this->isDefaultValueWidget($form_state),
-      ];
-      \Drupal::moduleHandler()->alter([
-        'field_widget_multivalue_form',
-        'field_widget_multivalue_' . $this->getPluginId() . '_form',
-      ], $elements, $form_state, $context);
     }
 
     return $elements;
diff --git a/core/modules/media/media.module b/core/modules/media/media.module
index 5f9368b9bc..455bab98b4 100644
--- a/core/modules/media/media.module
+++ b/core/modules/media/media.module
@@ -181,25 +181,97 @@ function media_form_field_ui_field_storage_add_form_alter(&$form, FormStateInter
 }
 
 /**
- * Implements hook_field_widget_multivalue_WIDGET_TYPE_form_alter().
+ * Implements hook_field_widget_multivalue_form_alter().
  */
-function media_field_widget_multivalue_entity_reference_autocomplete_form_alter(array &$elements, FormStateInterface $form_state, array $context) {
-  // Add a description to inform users where they can find and add new media.
-  // Only add the description on autocomplete widgets for entity reference
-  // field pointing to media.
-  if (!empty($elements[0]['target_id']['#type']) && ($elements[0]['target_id']['#type'] === 'entity_autocomplete') && ($elements[0]['target_id']['#target_type'] === 'media')) {
-    $elements['#theme'] = 'media_reference_help';
+function media_field_widget_multivalue_form_alter(array &$elements, FormStateInterface $form_state, array $context) {
+  // Only act on entity reference fields that reference media.
+  $field_type = $context['items']->getFieldDefinition()->getType();
+  $target_type = $context['items']->getFieldDefinition()->getFieldStorageDefinition()->getSetting('target_type');
+  if ($field_type !== 'entity_reference' ||  $target_type !== 'media') {
+    return;
+  }
+
+  // Autocomplete widgets need different help text than options widgets.
+  $widget_plugin_id = $context['widget']->getPluginId();
+  if (in_array($widget_plugin_id, array('entity_reference_autocomplete', 'entity_reference_autocomplete_tags'))) {
+    $is_autocomplete = TRUE;
+  }
+  else {
+    // @todo We can't yet properly alter non-autocomplete fields. Resolve this
+    //   in https://www.drupal.org/node/whatever and remove this condition.
+    return;
+  }
+  $elements['#media_help'] = [];
 
-    // Customize the label for the field widget.
-    $elements['#original_label'] = $elements['#title'];
-    $use_existing_label = t('Use existing media');
+  // Retrieve the media bundle list and add information for the user based on
+  // which bundles are available to be created or referenced.
+  $settings = $context['items']->getFieldDefinition()->getSetting('handler_settings');
+  $allowed_bundles = $settings['target_bundles'];
+  $access_handler = \Drupal::entityTypeManager()->getAccessControlHandler('media');
+  $all_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('media');
+  $bundle_labels = [];
+  $create_bundles = [];
+  foreach ($allowed_bundles as $bundle) {
+    $bundle_labels[] = $all_bundles[$bundle]['label'];
+    if ($access_handler->createAccess($bundle)) {
+      $create_bundles[] = $bundle;
+      if (count($create_bundles) > 1) {
+        // If the user has access to create more than 1 bundle then the
+        // individual media type form can not be used.
+        break;
+      }
+    }
+  }
 
-    if ($elements['#cardinality'] === 1) {
-      $elements[0]['target_id']['#title'] = $use_existing_label;
+  // Add a section about how to create media if the user has access to do so.
+  if (!empty($create_bundles)) {
+    if (count($create_bundles) === 1) {
+      $add_url = Url::fromRoute('entity.media.add_form')->setRouteParameter('media_type', $create_bundles[0])->toString();
     }
-    else {
-      $elements['#title'] = $use_existing_label;
+    elseif (count($create_bundles) > 1) {
+      $add_url = Url::fromRoute('entity.media.add_page')->toString();
     }
+    $elements['#media_help']['#media_add_help'] = t('Create your media on the <a href=":add_page" target="_blank">media add page</a> (opens a new window), then add it by name to the field below.', [':add_page' => $add_url]);
+  }
+
+  $elements['#theme'] = 'media_reference_help';
+  $cardinality = $context['items']->getFieldDefinition()->getFieldStorageDefinition()->getCardinality();
+  // @todo template_preprocess_field_multiple_value_form() assumes this key
+  //   exists, but it does not exist in the case of a single widget that
+  //   accepts multiple values. This is for some reason necessary to use
+  //   our template for the entity_autocomplete_tags widget.
+  //   Research and resolve this in htttps://www.drupal.org/node/nid.
+  if (empty($elements['#cardinality_multiple'])) {
+    $elements['#cardinality_multiple'] = NULL;
+  }
+
+  // Customize the label for the field widget.
+  // @todo Is there a better way to do this?
+  $use_existing_label = t('Use existing media');
+  if (!empty($elements[0]['target_id']['#title'])) {
+    $elements['#media_help']['#original_label'] = $elements[0]['target_id']['#title'];
+    $elements[0]['target_id']['#title'] = $use_existing_label;
+  }
+  elseif (!empty($elements['#title'])) {
+    $elements['#media_help']['#original_label'] = $elements['#title'];
+    $elements['#title'] = $use_existing_label;
+  }
+  elseif (!empty($elements['target_id']['#title'])) {
+    $elements['#media_help']['#original_label'] = $elements['target_id']['#title'];
+    $elements['target_id']['#title'] = $use_existing_label;
+  }
+
+  // Only present the help text about autcomplete on autocomplete widgets.
+  // When the user is presented with options, they don't need to type anything
+  // or know what types of media are allowed.
+  if ($is_autocomplete) {
+    $elements['#media_help']['#media_list_help'] = t('Type part of the media name.');
+
+    $overview_url = Url::fromRoute('entity.media.collection');
+    if ($overview_url->access()) {
+      $elements['#media_help']['#media_list_link'] = t('See the <a href=":list_url" target="_blank">media list</a> (opens a new window) to help locate media.', [':list_url' => $overview_url->toString()]);
+    }
+    $elements['#media_help']['#allowed_types_help'] = t('Allowed media types: %types', ['%types' => implode(", ", $bundle_labels)]);
   }
 }
 
@@ -220,42 +292,10 @@ function media_preprocess_media_reference_help(&$variables) {
   $variables['header_attributes'] = new Attribute();
   $variables['description']['attributes'] = new Attribute();
   $variables['legend_span_attributes'] = new Attribute();
-  $variables['label'] = $element['#original_label'];
-
-  if (!empty($element[0]['target_id']['#selection_settings']['target_bundles'])) {
-    $bundles = $element[0]['target_id']['#selection_settings']['target_bundles'];
-    $variables['media_list_help'] = t('Type part of the media name.');
 
-    $bundle_labels = [];
-    $create_bundles = [];
-    $access_handler = \Drupal::entityTypeManager()->getAccessControlHandler('media');
-    $all_bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo('media');
-    foreach ($bundles as $bundle) {
-      $bundle_labels[] = $all_bundles[$bundle]['label'];
-      if ($access_handler->createAccess($bundle)) {
-        $create_bundles[] = $bundle;
-        if (count($create_bundles) > 1) {
-          // If the user has access to create more than 1 bundle then the
-          // individual media type form can not be used.
-          break;
-        }
-      }
-    }
-
-    $variables['types'] = t('Allowed media types: %types', ['%types' => implode(", ", $bundle_labels)]);
-
-    if ($create_bundles) {
-      if (count($create_bundles) === 1) {
-        $add_url = Url::fromRoute('entity.media.add_form')->setRouteParameter('media_type', $create_bundles[0])->toString();
-      }
-      elseif (count($create_bundles) > 1) {
-        $add_url = Url::fromRoute('entity.media.add_page')->toString();
-      }
-      $variables['media_add_help'] = t('Create your media on the <a href=":add_page" target="_blank">media add page</a> (opens a new window), then add it by name to the field below.', [':add_page' => $add_url]);
-    }
-    $overview_url = Url::fromRoute('entity.media.collection');
-    if ($overview_url->access()) {
-      $variables['media_list_link'] = t('See the <a href=":list_url" target="_blank">media list</a> (opens a new window) to help locate media.', [':list_url' => $overview_url->toString()]);
+  if (!empty($element['#media_help'])) {
+    foreach ($element['#media_help'] as $key => $text) {
+      $variables[substr($key, 1)] = $text;
     }
   }
 }
diff --git a/core/modules/media/templates/media-reference-help.html.twig b/core/modules/media/templates/media-reference-help.html.twig
index bc7317ef89..9243c5d4fd 100644
--- a/core/modules/media/templates/media-reference-help.html.twig
+++ b/core/modules/media/templates/media-reference-help.html.twig
@@ -25,7 +25,7 @@
   %}
   {#  Always wrap fieldset legends in a <span> for CSS positioning. #}
   <legend{{ legend_attributes }}>
-    <span{{ legend_span_attributes.addClass(legend_span_classes) }}>{{ label }}</span>
+    <span{{ legend_span_attributes.addClass(legend_span_classes) }}>{{ original_label }}</span>
   </legend>
 
   <div class="js-form-item form-item">
@@ -51,11 +51,11 @@
     <div{{ description.attributes.addClass('description') }}>
       {% if multiple and description.content %}
         <ul>
-          <li>{{ media_list_help }} {{ media_list_link }} {{ types }}</li>
+          <li>{{ media_list_help }} {{ media_list_link }} {{ allowed_types_help }}</li>
           <li>{{ description.content }}</li>
         </ul>
       {% else %}
-        {{ media_list_help }} {{ media_list_link }} {{ types }}
+        {{ media_list_help }} {{ media_list_link }} {{ allowed_types_help }}
       {% endif %}
       {% if multiple and button %}
         <div class="clearfix">{{ button }}</div>
