diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
index 786f0da..d0ddbc2 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/field_type/ConfigurableEntityReferenceItem.php
@@ -128,7 +128,7 @@ public function settingsForm(array $form, array &$form_state, $has_data) {
    * {@inheritdoc}
    */
   public function instanceSettingsForm(array $form, array &$form_state) {
-    $field_definition = isset($form_state['instance']) ? $form_state['instance'] : $this->getInstance();
+    $instance = $form_state['instance'];
 
     // Get all selection plugins for this entity type.
     $selection_plugins = \Drupal::service('plugin.manager.entity_reference.selection')->getSelectionGroups($this->getFieldSetting('target_type'));
@@ -166,7 +166,7 @@ public function instanceSettingsForm(array $form, array &$form_state) {
       '#type' => 'select',
       '#title' => t('Reference method'),
       '#options' => $handlers_options,
-      '#default_value' => $field_definition->getFieldSetting('handler') ?: 'default',
+      '#default_value' => $instance->getFieldSetting('handler'),
       '#required' => TRUE,
       '#ajax' => TRUE,
       '#limit_validation_errors' => array(),
@@ -186,8 +186,8 @@ public function instanceSettingsForm(array $form, array &$form_state) {
       '#attributes' => array('class' => array('entity_reference-settings')),
     );
 
-    $handler = \Drupal::service('plugin.manager.entity_reference.selection')->getSelectionHandler($field_definition);
-    $form['handler']['handler_settings'] += $handler->settingsForm($field_definition);
+    $handler = \Drupal::service('plugin.manager.entity_reference.selection')->getSelectionHandler($instance);
+    $form['handler']['handler_settings'] += $handler->settingsForm($instance);
 
     return $form;
   }
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
index 77477d9..443e509 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
 use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
 use Drupal\field\FieldInterface;
+use Drupal\field\FieldInstanceInterface;
 
 /**
  * A common base class for configurable entity reference fields.
@@ -32,28 +33,6 @@ class ConfigEntityReferenceItemBase extends EntityReferenceItem implements Confi
   static $propertyDefinitions;
 
   /**
-   * The Field instance definition.
-   *
-   * @var \Drupal\field\Entity\FieldInstance
-   */
-  protected $instance;
-
-  /**
-   * Returns the field instance definition.
-   *
-   * Copied from \Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase,
-   * since we cannot extend it.
-   *
-   * @var \Drupal\field\Entity\FieldInstance
-   */
-  public function getInstance() {
-    if (!isset($this->instance) && $parent = $this->getParent()) {
-      $this->instance = $parent->getInstance();
-    }
-    return $this->instance;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getPropertyDefinitions() {
@@ -127,9 +106,13 @@ public function isEmpty() {
    */
   public function settingsForm(array $form, array &$form_state, $has_data) {
     if ($callback = $this->getLegacyCallback('settings_form')) {
+      $instance = $this->getFieldDefinition();
+      if (!($instance instanceof FieldInstanceInterface)) {
+        throw new \UnexpectedValueException('ConfigEntityReferenceItemBase::settingsForm() called for a field whose definition is not a field instance.');
+      }
       // hook_field_settings_form() used to receive the $instance (not actually
       // needed), and the value of field_has_data().
-      return $callback($this->getInstance()->getField(), $this->getInstance(), $has_data);
+      return $callback($instance->getField(), $instance, $has_data);
     }
     return array();
   }
@@ -142,7 +125,11 @@ public function settingsForm(array $form, array &$form_state, $has_data) {
    */
   public function instanceSettingsForm(array $form, array &$form_state) {
     if ($callback = $this->getLegacyCallback('instance_settings_form')) {
-      return $callback($this->getInstance()->getField(), $this->getInstance(), $form_state);
+      $instance = $this->getFieldDefinition();
+      if (!($instance instanceof FieldInstanceInterface)) {
+        throw new \UnexpectedValueException('ConfigEntityReferenceItemBase::instanceSettingsForm() called for a field whose definition is not a field instance.');
+      }
+      return $callback($instance->getField(), $instance, $form_state);
     }
     return array();
   }
@@ -161,7 +148,7 @@ public function getSettableOptions() {
       // We are at the field item level, so we need to go two levels up to get
       // to the entity object.
       $entity = $this->getParent()->getParent();
-      return $callback($this->getInstance(), $entity);
+      return $callback($this->getFieldDefinition(), $entity);
     }
   }
 
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigField.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigField.php
index 53fa2f5..eb2e4db 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigField.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigField.php
@@ -36,7 +36,7 @@ public function __construct(array $definition, $name = NULL, TypedDataInterface
   /**
    * {@inheritdoc}
    */
-  public function getInstance() {
+  public function getFieldDefinition() {
     if (!isset($this->instance) && $parent = $this->getParent()) {
       $instances = FieldAPI::fieldInfo()->getBundleInstances($parent->entityType(), $parent->bundle());
       $this->instance = $instances[$this->getName()];
@@ -47,13 +47,6 @@ public function getInstance() {
   /**
    * {@inheritdoc}
    */
-  public function getFieldDefinition() {
-    return $this->getInstance();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getConstraints() {
     $constraints = array();
     // Check that the number of values doesn't exceed the field cardinality. For
@@ -76,14 +69,14 @@ public function getConstraints() {
    * {@inheritdoc}
    */
   protected function getDefaultValue() {
-    return $this->getInstance()->getFieldDefaultValue($this->getParent());
+    return $this->getFieldDefinition()->getFieldDefaultValue($this->getParent());
   }
 
   /**
    * {@inheritdoc}
    */
   public function defaultValuesForm(array &$form, array &$form_state) {
-    if (empty($this->getInstance()->default_value_function)) {
+    if (empty($this->getFieldDefinition()->default_value_function)) {
       $entity = $this->getParent();
       $widget = $this->defaultValueWidget($form_state);
 
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldInterface.php
index 27c8b1f..2df30a9 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldInterface.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldInterface.php
@@ -15,13 +15,6 @@
 interface ConfigFieldInterface extends FieldInterface {
 
   /**
-   * Returns the field instance definition.
-   *
-   * @var \Drupal\field\Entity\FieldInstance
-   */
-  public function getInstance();
-
-  /**
    * Returns a form for the default value input.
    *
    * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php
index 4313b43..eb16d87 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php
@@ -15,23 +15,6 @@
 abstract class ConfigFieldItemBase extends FieldItemBase implements ConfigFieldItemInterface {
 
   /**
-   * The Field instance definition.
-   *
-   * @var \Drupal\field\Entity\FieldInstance
-   */
-  public $instance;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getInstance() {
-    if (!isset($this->instance) && $parent = $this->getParent()) {
-      $this->instance = $parent->getInstance();
-    }
-    return $this->instance;
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function settingsForm(array $form, array &$form_state, $has_data) {
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemInterface.php
index a584640..88de2ac 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemInterface.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemInterface.php
@@ -16,13 +16,6 @@
 interface ConfigFieldItemInterface extends FieldItemInterface {
 
   /**
-   * Returns the field instance definition.
-   *
-   * @var \Drupal\field\FieldInstanceInterface
-   */
-  public function getInstance();
-
-  /**
    * Returns the schema for the field.
    *
    * This method is static, because the field schema information is needed on
diff --git a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigField.php b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigField.php
index da703fa..ce171ba 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigField.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigField.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\field\Plugin\Type\FieldType\ConfigField;
+use Drupal\field\FieldInstanceInterface;
 use Symfony\Component\Validator\ConstraintViolation;
 
 /**
@@ -41,14 +42,16 @@ public function validate() {
 
     $entity = $this->getParent();
     $langcode = $entity->language()->id;
+    $field_name = $this->getFieldDefinition()->getFieldName();
 
-    if (isset($legacy_errors[$this->getInstance()->getField()->name][$langcode])) {
-      foreach ($legacy_errors[$this->getInstance()->getField()->name][$langcode] as $delta => $item_errors) {
+    if (isset($legacy_errors[$field_name][$langcode])) {
+      foreach ($legacy_errors[$field_name][$langcode] as $delta => $item_errors) {
         foreach ($item_errors as $item_error) {
           // We do not have the information about which column triggered the
           // error, so assume the first column...
-          $column = key($this->getInstance()->getField()->getColumns());
-          $violations->add(new ConstraintViolation($item_error['message'], $item_error['message'], array(), $this, $delta . '.' . $column, $this->offsetGet($delta)->get($column)->getValue(), NULL, $item_error['error']));
+          $property_names = $this->getFieldDefinition()->getFieldPropertyNames();
+          $property_name = $property_names[0];
+          $violations->add(new ConstraintViolation($item_error['message'], $item_error['message'], array(), $this, $delta . '.' . $property_name, $this->offsetGet($delta)->get($property_name)->getValue(), NULL, $item_error['error']));
         }
       }
     }
@@ -115,8 +118,8 @@ protected function legacyCallback($hook, $args = array()) {
       $items = (array) $this->getValue(TRUE);
       $args = array_merge(array(
         $entity,
-        $this->getInstance()->getField(),
-        $this->getInstance(),
+        $this->getFieldInstance()->getField(),
+        $this->getFieldInstance(),
         $langcode,
         &$items
       ), $args);
@@ -125,4 +128,18 @@ protected function legacyCallback($hook, $args = array()) {
     }
   }
 
+  /**
+   * Returns the field instance.
+   *
+   * @return \Drupal\field\FieldInstanceInterface
+   *   The field instance.
+   */
+  protected function getFieldInstance() {
+    $instance = $this->getFieldDefinition();
+    if (!($instance instanceof FieldInstanceInterface)) {
+      throw new \UnexpectedValueException('LegacyConfigField::getFieldInstance() called for a field whose definition is not a field instance.');
+    }
+    return $instance;
+  }
+
 }
diff --git a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItem.php b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItem.php
index 7c7e032..0970aa9 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItem.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItem.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\Field\PrepareCacheInterface;
 use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase;
 use Drupal\field\FieldInterface;
+use Drupal\field\FieldInstanceInterface;
 
 /**
  * Plugin implementation for legacy field types.
@@ -49,7 +50,7 @@ public function isEmpty() {
     $item = $this->getValue(TRUE);
     // The previous hook was never called on an empty item, but EntityNG always
     // creates a FieldItem element for an empty field.
-    return empty($item) || $callback($item, $this->getInstance()->getField()->type);
+    return empty($item) || $callback($item, $this->getFieldDefinition()->getFieldType());
   }
 
   /**
@@ -59,7 +60,7 @@ public function settingsForm(array $form, array &$form_state, $has_data) {
     if ($callback = $this->getLegacyCallback('settings_form')) {
       // hook_field_settings_form() used to receive the $instance (not actually
       // needed), and the value of field_has_data().
-      return $callback($this->getInstance()->getField(), $this->getInstance(), $has_data);
+      return $callback($this->getFieldInstance()->getField(), $this->getFieldInstance(), $has_data);
     }
     return array();
   }
@@ -69,7 +70,7 @@ public function settingsForm(array $form, array &$form_state, $has_data) {
    */
   public function instanceSettingsForm(array $form, array &$form_state) {
     if ($callback = $this->getLegacyCallback('instance_settings_form')) {
-      return $callback($this->getInstance()->getField(), $this->getInstance(), $form_state);
+      return $callback($this->getFieldInstance()->getField(), $this->getFieldInstance(), $form_state);
     }
     return array();
   }
@@ -96,8 +97,8 @@ public function prepareCache() {
       $args = array(
         $entity->entityType(),
         array($entity_id => $entity),
-        $this->getInstance()->getField(),
-        array($entity_id => $this->getInstance()),
+        $this->getFieldInstance()->getField(),
+        array($entity_id => $this->getFieldInstance()),
         $langcode,
         &$items,
         FIELD_LOAD_CURRENT,
@@ -119,7 +120,7 @@ public function getSettableOptions() {
     $callback = "{$definition['provider']}_options_list";
     if (function_exists($callback)) {
       $entity = $this->getParent()->getParent();
-      return $callback($this->getInstance(), $entity);
+      return $callback($this->getFieldDefinition(), $entity);
     }
   }
 
@@ -141,4 +142,18 @@ protected function getLegacyCallback($hook) {
     }
   }
 
+  /**
+   * Returns the field instance.
+   *
+   * @return \Drupal\field\Entity\FieldInstanceInterface
+   *   The field instance.
+   */
+  protected function getFieldInstance() {
+    $instance = $this->getFieldDefinition();
+    if (!($instance instanceof FieldInstanceInterface)) {
+      throw new \UnexpectedValueException('LegacyConfigFieldItem::getFieldInstance() called for a field whose definition is not a field instance.');
+    }
+    return $instance;
+  }
+
 }
