diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php
index b208e36..8dbe16e 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php
@@ -39,14 +39,14 @@ class DateTimeDatelistWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
-  public function __construct($plugin_id, array $plugin_definition, FieldDefinitionInterface $field_definition, array $settings) {
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
     // Identify the function used to set the default value.
     // @todo Make this work for both configurable and nonconfigurable fields:
     //   https://drupal.org/node/1989468.
-    if ($field_definition instanceof FieldInstanceInterface) {
-      $field_definition->default_value_function = $this->defaultValueFunction();
+    if ($configuration['field_definition'] instanceof FieldInstanceInterface) {
+      $configuration['field_definition']->default_value_function = $this->defaultValueFunction();
     }
-    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings);
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
   }
 
   /**
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php
index da550c7..d718a55 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php
@@ -40,14 +40,14 @@ class DateTimeDefaultWidget extends WidgetBase {
   /**
    * {@inheritdoc}
    */
-  public function __construct($plugin_id, array $plugin_definition, FieldDefinitionInterface $field_definition, array $settings) {
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
     // Identify the function used to set the default value.
     // @todo Make this work for both configurable and nonconfigurable fields:
     //   https://drupal.org/node/1989468.
-    if ($field_definition instanceof FieldInstanceInterface) {
-      $field_definition->default_value_function = $this->defaultValueFunction();
+    if ($configuration['field_definition'] instanceof FieldInstanceInterface) {
+      $configuration['field_definition']->default_value_function = $this->defaultValueFunction();
     }
-    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings);
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     // @todo Inject this once https://drupal.org/node/2035317 is in.
     $this->dateStorage = \Drupal::entityManager()->getStorageController('date_format');
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
index 7c7a343..3444ccb 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php
@@ -37,20 +37,21 @@
   /**
    * Constructs a WidgetBase object.
    *
+   * @param array $configuration
+   *   A configuration array containing two keys:
+   *   - settings: The widget settings.
+   *   - field_definition: The definition of the field with which the widget is
+   *     associated: \Drupal\Core\Entity\Field\FieldDefinitionInterface.
    * @param array $plugin_id
    *   The plugin_id for the widget.
    * @param array $plugin_definition
    *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\Field\FieldDefinitionInterface $field_definition
-   *   The definition of the field to which the widget is associated.
-   * @param array $settings
-   *   The widget settings.
    */
-  public function __construct($plugin_id, array $plugin_definition, FieldDefinitionInterface $field_definition, array $settings) {
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
     parent::__construct(array(), $plugin_id, $plugin_definition);
 
-    $this->fieldDefinition = $field_definition;
-    $this->settings = $settings;
+    $this->fieldDefinition = $configuration['field_definition'];
+    $this->settings = $configuration['settings'];
   }
 
   /**
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php
deleted file mode 100644
index 4b7cb6b..0000000
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\field\Plugin\WidgetFactory.
- */
-
-namespace Drupal\field\Plugin\Type\Widget;
-
-use Drupal\Component\Plugin\Factory\DefaultFactory;
-
-/**
- * Factory class for the Widget plugin type.
- */
-class WidgetFactory extends DefaultFactory {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function createInstance($plugin_id, array $configuration) {
-    $plugin_definition = $this->discovery->getDefinition($plugin_id);
-    $plugin_class = static::getPluginClass($plugin_id, $plugin_definition);
-    return new $plugin_class($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings']);
-  }
-}
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
index 12bb296..f6d001c 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php
@@ -61,7 +61,6 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
     $this->setCacheBackend($cache_backend, $language_manager, 'field_widget_types');
     $this->alterInfo($module_handler, 'field_widget_info');
 
-    $this->factory = new WidgetFactory($this);
     $this->fieldTypeManager = $field_type_manager;
   }
 
diff --git a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php
index 0d55ab3..7aae718 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php
@@ -37,8 +37,9 @@
   /**
    * {@inheritdoc}
    */
-  public function __construct($plugin_id, array $plugin_definition, FieldDefinitionInterface $field_definition, array $settings) {
-    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings);
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
     $property_names = $this->fieldDefinition->getFieldPropertyNames();
     $this->column = $property_names[0];
   }
