 core/modules/hal/src/Normalizer/ContentEntityNormalizer.php    | 10 +++++++++-
 .../hal/src/Normalizer/EntityReferenceItemNormalizer.php       |  2 +-
 .../src/Normalizer/EntityReferenceFieldItemNormalizer.php      |  4 ++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/core/modules/hal/src/Normalizer/ContentEntityNormalizer.php b/core/modules/hal/src/Normalizer/ContentEntityNormalizer.php
index eb45247..10a9746 100644
--- a/core/modules/hal/src/Normalizer/ContentEntityNormalizer.php
+++ b/core/modules/hal/src/Normalizer/ContentEntityNormalizer.php
@@ -76,7 +76,10 @@ public function normalize($entity, $format = NULL, array $context = []) {
     if (isset($context['included_fields'])) {
       $field_items = [];
       foreach ($context['included_fields'] as $field_name) {
-        $field_items[] = $entity->get($field_name);
+        // Entity labels need special handling, see below.
+        if ($field_name !== 'label') {
+          $field_items[] = $entity->get($field_name);
+        }
       }
     }
     else {
@@ -92,6 +95,11 @@ public function normalize($entity, $format = NULL, array $context = []) {
       $normalized = NestedArray::mergeDeep($normalized, $normalized_property);
     }
 
+    // Special handling for normalizing entity labels.
+    if (isset($context['included_fields']) && in_array('label', $context['included_fields'], TRUE) && $entity->access('view label')) {
+      $normalized['label'] = $entity->label();
+    }
+
     return $normalized;
   }
 
diff --git a/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php b/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
index fbcae8c..64af7e1 100644
--- a/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
+++ b/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
@@ -64,7 +64,7 @@ public function normalize($field_item, $format = NULL, array $context = []) {
     // will include the langcode.
     $langcode = isset($context['langcode']) ? $context['langcode'] : NULL;
     unset($context['langcode']);
-    $context['included_fields'] = ['uuid'];
+    $context['included_fields'] = ['uuid', 'label'];
 
     // Normalize the target entity.
     $embedded = $this->serializer->normalize($target_entity, $format, $context);
diff --git a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
index ea2e020..705fafe 100644
--- a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
+++ b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
@@ -54,6 +54,10 @@ public function normalize($field_item, $format = NULL, array $context = []) {
       if ($url = $entity->url('canonical')) {
         $values['url'] = $url;
       }
+
+      if ($entity->access('view label')) {
+        $values['label'] = $entity->label();
+      }
     }
     return $values;
   }
