diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/BooleanCheckboxWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/BooleanCheckboxWidget.php
index 1d4a202f00..4a5425ac52 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/BooleanCheckboxWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/BooleanCheckboxWidget.php
@@ -63,6 +63,18 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#default_value' => !empty($items[0]->value),
     ];
 
+    // There is no way to distinguish between the "Off" value and no value at
+    // all using a checkbox input. Making a checkbox input required in fact does
+    // not require that "a value" (in other words either the "On" value or the
+    // "Off" value) is input, instead it forces the checkbox to be checked which
+    // corresponds to selecting the "On" value. Thus we do not mark the the
+    // checkbox required even if the field definition is required.
+    // Strictly speaking the checkbox widget should only be available for
+    // required field definitions in the first place, but enforcing this would
+    // both break existing sites and present a confusing user interface to users
+    // who are not aware of this subtlety.
+    $element['value']['#required'] = FALSE;
+
     // Override the title from the incoming $element.
     if ($this->getSetting('display_label')) {
       $element['value']['#title'] = $this->fieldDefinition->getLabel();
