diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 487878f..e74b8c8 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -424,6 +424,14 @@ function field_entity_field_info($entity_type) {
 }
 
 /**
+ * Implements hook_field_widget_info_alter().
+ */
+function field_field_widget_info_alter(&$info) {
+  // Add the Hidden widget to all field types.
+  $info['field_hidden']['field_types'] = array_keys(field_info_field_types());
+}
+
+/**
  * Applies language fallback rules to the fields attached to the given entity.
  *
  * Core language fallback rules simply check if fields have a field translation
diff --git a/core/modules/field/lib/Drupal/field/FieldInstance.php b/core/modules/field/lib/Drupal/field/FieldInstance.php
index a1e7a4f..d04146b 100644
--- a/core/modules/field/lib/Drupal/field/FieldInstance.php
+++ b/core/modules/field/lib/Drupal/field/FieldInstance.php
@@ -46,12 +46,31 @@ public function __construct(array $definition) {
   /**
    * Returns the Widget plugin for the instance.
    *
-   * @return Drupal\field\Plugin\Type\Widget\WidgetInterface
+   * @param bool $instance_settings_form
+   *   (optional) Whether we are getting the widget for the field instance
+   *   settings form. Defaults to FALSE.
+   *
+   * @return \Drupal\field\Plugin\Type\Widget\WidgetInterface
    *   The Widget plugin to be used for the instance.
    */
-  public function getWidget() {
-    if (empty($this->widget)) {
-      $widget_properties = $this->definition['widget'];
+  public function getWidget($instance_settings_form = FALSE) {
+    // Skip the static cache if we are getting the widget for the field instance
+    // settings form.
+    if (empty($this->widget) || $instance_settings_form) {
+      if ($instance_settings_form && $this->definition['widget']['type'] == 'field_hidden') {
+        $field = field_info_field_by_id($this->definition['field_id']);
+        $field_type = field_info_field_types($field['type']);
+        $default_widget = field_info_widget_types($field_type['default_widget']);
+
+        $widget_properties = array(
+          'type' => $default_widget['id'],
+          'settings' => $default_widget['settings'],
+          'weight' => 0,
+        );
+      }
+      else {
+        $widget_properties = $this->definition['widget'];
+      }
 
       // Let modules alter the widget properties.
       $context = array(
diff --git a/core/modules/field/lib/Drupal/field/Plugin/field/widget/HiddenWidget.php b/core/modules/field/lib/Drupal/field/Plugin/field/widget/HiddenWidget.php
new file mode 100644
index 0000000..7ab76e4
--- /dev/null
+++ b/core/modules/field/lib/Drupal/field/Plugin/field/widget/HiddenWidget.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\field\Plugin\field\widget\HiddenWidget.
+ */
+
+namespace Drupal\field\Plugin\field\widget;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\Widget\WidgetBase;
+
+/**
+ * Plugin implementation of the 'field_hidden' widget.
+ *
+ * @Plugin(
+ *   id = "field_hidden",
+ *   module = "field",
+ *   label = @Translation("- Hidden -"),
+ *   multiple_values = TRUE,
+ *   weight = 50
+ * )
+ */
+class HiddenWidget extends WidgetBase {
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
+   */
+  public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
+    // The purpose of this widget is to be hidden, so nothing to do here.
+    return array();
+  }
+}
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index 00cb8de..f99a88a 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -1005,7 +1005,7 @@ function field_ui_default_value_widget($field, $instance, &$form, &$form_state)
   // Insert the widget. Since we do not use the "official" instance definition,
   // the whole flow cannot use field_invoke_method().
   $items = (array) $instance['default_value'];
-  $element += $instance->getWidget()->form($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
+  $element += $instance->getWidget(TRUE)->form($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
 
   return $element;
 }
@@ -1027,7 +1027,7 @@ function field_ui_field_edit_form_validate($form, &$form_state) {
 
     // Extract the 'default value'.
     $items = array();
-    $instance->getWidget()->submit($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
+    $instance->getWidget(TRUE)->submit($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
 
     // Grab the field definition from $form_state.
     $field_state = field_form_get_state($element['#parents'], $field_name, LANGUAGE_NOT_SPECIFIED, $form_state);
@@ -1047,7 +1047,7 @@ function field_ui_field_edit_form_validate($form, &$form_state) {
       field_form_set_state($element['#parents'], $field_name, LANGUAGE_NOT_SPECIFIED, $form_state, $field_state);
 
       // Assign reported errors to the correct form element.
-      $instance->getWidget()->flagErrors($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
+      $instance->getWidget(TRUE)->flagErrors($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
     }
   }
 }
@@ -1068,7 +1068,7 @@ function field_ui_field_edit_form_submit($form, &$form_state) {
 
     // Extract field values.
     $items = array();
-    $instance->getWidget()->submit($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
+    $instance->getWidget(TRUE)->submit($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state);
 
     $instance['default_value'] = $items ? $items : NULL;
   }
