diff --git a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
index 9cb8642b7d..bdc424d362 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
@@ -17,6 +17,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\user\EntityOwnerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -190,6 +191,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         $bundle_options[$bundle_name] = $bundle_info['label'];
       }
       natsort($bundle_options);
+      $selected_bundles = array_intersect_key($bundle_options, array_filter((array) $configuration['target_bundles']));
 
       $form['target_bundles'] = [
         '#type' => 'checkboxes',
@@ -222,35 +224,15 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
     }
 
     if ($entity_type->entityClassImplements(FieldableEntityInterface::class)) {
-      $fields = [];
-      foreach (array_keys($bundles) as $bundle) {
-        $bundle_fields = array_filter($this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle), function ($field_definition) {
-          return !$field_definition->isComputed();
-        });
-        foreach ($bundle_fields as $field_name => $field_definition) {
-          /* @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */
-          $columns = $field_definition->getFieldStorageDefinition()->getColumns();
-          // If there is more than one column, display them all, otherwise just
-          // display the field label.
-          // @todo: Use property labels instead of the column name.
-          if (count($columns) > 1) {
-            foreach ($columns as $column_name => $column_info) {
-              $fields[$field_name . '.' . $column_name] = $this->t('@label (@column)', ['@label' => $field_definition->getLabel(), '@column' => $column_name]);
-            }
-          }
-          else {
-            $fields[$field_name] = $this->t('@label', ['@label' => $field_definition->getLabel()]);
-          }
-        }
-      }
-
+      $options = $entity_type->hasKey('bundle') ? $selected_bundles : $bundles;
       $form['sort']['field'] = [
         '#type' => 'select',
         '#title' => $this->t('Sort by'),
-        '#options' => [
-          '_none' => $this->t('- None -'),
-        ] + $fields,
         '#ajax' => TRUE,
+        '#options' => $this->calculateSortOptions($entity_type_id, array_keys($options)),
+        '#empty_value' => '_none',
+        '#sort_options' => TRUE,
+        '#sort_start' => 2,
         '#limit_validation_errors' => [],
         '#default_value' => $configuration['sort']['field'],
       ];
@@ -283,13 +265,12 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
     ];
 
     if ($entity_type->hasKey('bundle')) {
-      $bundles = array_intersect_key($bundle_options, array_filter((array) $configuration['target_bundles']));
       $form['auto_create_bundle'] = [
         '#type' => 'select',
         '#title' => $this->t('Store new items in'),
-        '#options' => $bundles,
+        '#options' => $selected_bundles,
         '#default_value' => $configuration['auto_create_bundle'],
-        '#access' => count($bundles) > 1,
+        '#access' => count($selected_bundles) > 1,
         '#states' => [
           'visible' => [
             ':input[name="settings[handler_settings][auto_create]"]' => ['checked' => TRUE],
@@ -490,4 +471,94 @@ protected function reAlterQuery(AlterableInterface $query, $tag, $base_table) {
     $query->alterMetaData = $old_metadata;
   }
 
+  /**
+   * Makes a list of options for the sort select list.
+   *
+   * @param string $entity_type
+   *   The ID of the entity type.
+   * @param string[] $bundles
+   *   Array of IDs of bundles to check for sort options.
+   *
+   * @return array
+   *   Array whose keys are field or field.column machine names, and whose
+   *   values are labels to use for the UI for selecting sort options.
+   */
+  protected function calculateSortOptions($entity_type, array $bundles) {
+    // A single field may have different labels for different bundles.  Count
+    // how many times each label is used for each field. For each field and
+    // label, also save the data we need to create an option label for the field.
+    $fields = [];
+    foreach ($bundles as $bundle) {
+      foreach ($this->entityFieldManager->getFieldDefinitions($entity_type, $bundle) as $field_name => $field_definition) {
+        /* @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */
+        if ($field_definition->isComputed()) {
+          // Computed fields cannot be used for sorting.
+          continue;
+        }
+        $label = $field_definition->getLabel();
+        $label_key = ($label instanceof TranslatableMarkup)
+          ? $label->getUntranslatedString() : $label;
+        if (empty($fields[$field_name][$label_key])) {
+          $columns = $field_definition->getFieldStorageDefinition()->getColumns();
+          $fields[$field_name][$label_key] = [
+            'count' => 1,
+            'label' => $label,
+            'columns' => array_keys($columns),
+          ];
+        }
+        else {
+          ++$fields[$field_name][$label_key]['count'];
+        }
+      }
+    }
+
+    // Process the data in $fields to create an array of options for a select
+    // element. The format is 'Label,… (column) [field_name.column]'. If the
+    // field has the same label for all bundles, then omit ',…'. If the field
+    // has only one column, then omit '(column)' and '.column'. Also, the
+    // fields with multiple labels go into an optgroup.
+    $options = [];
+    $group_key = (string) $this->t('Fields with multiple labels:');
+    $options[$group_key] = ['#sort_options' => TRUE];
+    foreach ($fields as $field_name => $list) {
+      // Sort by count, to put the most-used label at the end of the list.
+      usort($list, function ($a, $b) {
+        return $a['count'] <=> $b['count'];
+      });
+      $single_label = count($list) == 1;
+      $info = array_pop($list);
+      $arguments = ['@label' => $info['label'], '@field' => $field_name];
+      $single_column = count($info['columns']) == 1;
+      // Do not use formatPlural() here, because some languages (like Chinese)
+      // have only 1 or many plural forms, and we really just want these 2
+      // alternatives.
+      if ($single_column) {
+        if ($single_label) {
+          $options[$field_name] = $this->t('@label [@field]', $arguments);
+        }
+        else {
+          $options[$group_key][$field_name] = $this->t('@label,… [@field]', $arguments);
+        }
+      }
+      else {
+        foreach ($info['columns'] as $column_name) {
+          $arguments['@column'] = $column_name;
+          $column_key = "$field_name.$column_name";
+          if ($single_label) {
+            $options[$column_key] = $this->t('@label (@column) [@field.@column]', $arguments);
+          }
+          else {
+            $options[$group_key][$column_key] = $this->t('@label (@column),… [@field.@column]', $arguments);
+          }
+        }
+      }
+    }
+    // $options[$group_key] has at least the key '#sort_options'.
+    if (count($options[$group_key]) == 1) {
+      unset($options[$group_key]);
+    }
+
+    return $options;
+  }
+
 }
diff --git a/core/modules/field/tests/src/FunctionalJavascript/EntityReference/EntityReferenceAdminTest.php b/core/modules/field/tests/src/FunctionalJavascript/EntityReference/EntityReferenceAdminTest.php
index 7b6fabe488..0376424055 100644
--- a/core/modules/field/tests/src/FunctionalJavascript/EntityReference/EntityReferenceAdminTest.php
+++ b/core/modules/field/tests/src/FunctionalJavascript/EntityReference/EntityReferenceAdminTest.php
@@ -94,11 +94,14 @@ public function testFieldAdminHandler() {
 
     // The base handler settings should be displayed.
     $entity_type_id = 'node';
-    // Check that the type label is correctly displayed.
+    // Check that the type label is correctly displayed. Select all bundles so
+    // that sort options are available.
     $assert_session->pageTextContains('Content type');
     $bundles = $this->container->get('entity_type.bundle.info')->getBundleInfo($entity_type_id);
     foreach ($bundles as $bundle_name => $bundle_info) {
       $this->assertFieldByName('settings[handler_settings][target_bundles][' . $bundle_name . ']');
+      $page->findField('settings[handler_settings][target_bundles][' . $bundle_name . ']')->setValue($bundle_name);
+      $assert_session->assertWaitOnAjaxRequest();
     }
 
     reset($bundles);
@@ -125,8 +128,6 @@ public function testFieldAdminHandler() {
     $this->assertNoFieldByName('settings[handler_settings][sort][direction]');
 
     // Third step: confirm.
-    $page->findField('settings[handler_settings][target_bundles][' . key($bundles) . ']')->setValue(key($bundles));
-    $assert_session->assertWaitOnAjaxRequest();
     $this->drupalPostForm(NULL, [
       'required' => '1',
     ], t('Save settings'));
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityReferenceSelection/EntityReferenceSelectionLabelTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityReferenceSelection/EntityReferenceSelectionLabelTest.php
new file mode 100644
index 0000000000..a2942ab52b
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityReferenceSelection/EntityReferenceSelectionLabelTest.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity\EntityReferenceSelection;
+
+use Drupal\Core\Form\FormState;
+use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\node\Entity\NodeType;
+
+/**
+ * Tests the labels of referenced fields.
+ *
+ * @group entity_reference
+ */
+class EntityReferenceSelectionLabelTest extends EntityKernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['node'];
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Create three node types.
+    $bundle1 = NodeType::create(['type' => 'bundle1']);
+    $bundle1->save();
+    $bundle2 = NodeType::create(['type' => 'bundle2']);
+    $bundle2->save();
+    $bundle3 = NodeType::create(['type' => 'bundle3']);
+    $bundle3->save();
+  }
+
+  /**
+   * Assert labels for entity reference fields.
+   */
+  public function testLabels() {
+    // Add two string fields, with only one column.
+    $values = [
+      'field_name' => 'field_string1',
+      'entity_type' => 'node',
+      'type' => 'string',
+      'entity_types' => ['node'],
+    ];
+    FieldStorageConfig::create($values)->save();
+    $values['field_name'] = 'field_string2';
+    FieldStorageConfig::create($values)->save();
+
+    // Add two text fields, with columns value and format.
+    $values['type'] = 'text';
+    $values['field_name'] = 'field_text1';
+    FieldStorageConfig::create($values)->save();
+    $values['field_name'] = 'field_text2';
+    FieldStorageConfig::create($values)->save();
+
+    // Add the first string field to two node types with the same label.
+    $options = [
+      'label' => 'String Field',
+      'field_name' => 'field_string1',
+      'entity_type' => 'node',
+      'bundle' => 'bundle1',
+      'settings' => [],
+      'required' => FALSE,
+    ];
+    FieldConfig::create($options)->save();
+    $options['bundle'] = 'bundle2';
+    FieldConfig::create($options)->save();
+
+    // Add the second string field to three node types with two labels.
+    $options['field_name'] = 'field_string2';
+    $options['bundle'] = 'bundle1';
+    FieldConfig::create($options)->save();
+    $options['bundle'] = 'bundle2';
+    FieldConfig::create($options)->save();
+    $options['bundle'] = 'bundle3';
+    $options['label'] = 'Another Label';
+    FieldConfig::create($options)->save();
+
+    // Add the first text field to two node types with the same label.
+    $options = [
+      'label' => 'Text Field',
+      'field_name' => 'field_text1',
+      'entity_type' => 'node',
+      'bundle' => 'bundle2',
+      'settings' => [],
+      'required' => FALSE,
+    ];
+    FieldConfig::create($options)->save();
+    $options['bundle'] = 'bundle3';
+    FieldConfig::create($options)->save();
+
+    // Add the second text field to three node types with two different labels.
+    $options['field_name'] = 'field_text2';
+    $options['bundle'] = 'bundle1';
+    FieldConfig::create($options)->save();
+    $options['label'] = 'Another Label';
+    $options['bundle'] = 'bundle2';
+    FieldConfig::create($options)->save();
+    $options['bundle'] = 'bundle3';
+    FieldConfig::create($options)->save();
+
+    $selection_options = [
+      'target_type' => 'node',
+      'handler' => 'default',
+      'target_bundles' => [
+        'bundle1' => 'bundle1',
+        'bundle2' => 'bundle2',
+        'bundle3' => 'bundle3',
+      ],
+    ];
+    $handler = $this
+      ->container
+      ->get('plugin.manager.entity_reference_selection')
+      ->getInstance($selection_options);
+
+    $form = $handler->buildConfigurationForm([], new FormState());
+    $options = $form['sort']['field']['#options'];
+    $expected_result = [
+      'field_string1' => 'String Field [field_string1]',
+      'field_string2' => 'String Field,… [field_string2]',
+      'field_text1.value' => 'Text Field (value) [field_text1.value]',
+      'field_text2.value' => 'Another Label (value),… [field_text2.value]',
+    ];
+    $group_key = 'Fields with multiple labels:';
+    $this->assertEqual($options['field_string1'], $expected_result['field_string1'], 'The first string field has the expected label.');
+    $this->assertEqual($options[$group_key]['field_string2'], $expected_result['field_string2'], 'The second string field has the expected label.');
+    $this->assertEqual($options['field_text1.value'], $expected_result['field_text1.value'], 'The first text field has the expected label.');
+    $this->assertEqual($options[$group_key]['field_text2.value'], $expected_result['field_text2.value'], 'The second text field has the expected label.');
+  }
+
+}
