diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 7c5f7ed..5b22d29 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -372,7 +372,7 @@ protected function submitEntityLanguage(array $form, array &$form_state) {
       $current_langcode = $entity->language()->langcode == $form_langcode ? $form_state['values']['langcode'] : $form_langcode;
 
       foreach (field_info_instances($entity_type, $entity->bundle()) as $instance) {
-        $field_name = $instance['field_name'];
+        $field_name = $instance->getFieldId();
         $field = field_info_field($field_name);
         $previous_langcode = $form[$field_name]['#language'];
 
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
index 35f4b98..4161d43 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockTypeTest.php
@@ -79,7 +79,7 @@ public function testCustomBlockTypeEditing() {
     $this->createCustomBlockType('other');
 
     $instance = field_info_instance('custom_block', 'block_body', 'basic');
-    $this->assertEqual($instance['label'], 'Block body', 'Body field was found.');
+    $this->assertEqual($instance->label, 'Block body', 'Body field was found.');
 
     // Verify that title and body fields are displayed.
     $this->drupalGet('block/add/basic');
diff --git a/core/modules/datetime/datetime.module b/core/modules/datetime/datetime.module
index b545c36..57bdad1 100644
--- a/core/modules/datetime/datetime.module
+++ b/core/modules/datetime/datetime.module
@@ -134,7 +134,7 @@ function datetime_field_settings_form($field, $instance, $has_data) {
  * Implements hook_field_instance_settings_form().
  */
 function datetime_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['default_value'] = array(
     '#type' => 'select',
@@ -251,7 +251,7 @@ function datetime_field_load($entity_type, $entities, $field, $instances, $langc
 /**
  * Sets a default value for an empty date field.
  *
- * Callback for $instance['default_value_function'], as implemented by
+ * Callback for $instance->default_value_function, as implemented by
  * Drupal\datetime\Plugin\field\widget\DateTimeDatepicker.
  *
  * @param $entity_type
@@ -272,7 +272,7 @@ function datetime_default_value($entity, $field, $instance, $langcode) {
 
   $value = '';
   $date = '';
-  if ($instance['settings']['default_value'] == 'now') {
+  if ($instance->settings['default_value'] == 'now') {
     // A default value should be in the format and timezone used for date
     // storage.
     $date = new DrupalDateTime('now', DATETIME_STORAGE_TIMEZONE);
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 f0d60fe..a84748c 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
@@ -40,7 +40,7 @@ class DateTimeDatelistWidget extends WidgetBase {
    */
   public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings) {
     // Identify the function used to set the default value.
-    $instance['default_value_function'] = $this->defaultValueFunction();
+    $instance->default_value_function = $this->defaultValueFunction();
     parent::__construct($plugin_id, $plugin_definition, $instance, $settings);
   }
 
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 f0c45c0..f2bd204 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
@@ -34,7 +34,7 @@ class DateTimeDefaultWidget extends WidgetBase {
    */
   public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings) {
     // Identify the function used to set the default value.
-    $instance['default_value_function'] = $this->defaultValueFunction();
+    $instance->default_value_function = $this->defaultValueFunction();
     parent::__construct($plugin_id, $plugin_definition, $instance, $settings);
   }
 
diff --git a/core/modules/datetime/lib/Drupal/datetime/Tests/DatetimeFieldTest.php b/core/modules/datetime/lib/Drupal/datetime/Tests/DatetimeFieldTest.php
index dd7712e..1d536fb 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Tests/DatetimeFieldTest.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Tests/DatetimeFieldTest.php
@@ -63,7 +63,7 @@ function setUp() {
       ),
     ));
 
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field['field_name'], array(
         'type' => 'datetime_default',
       ))
@@ -74,7 +74,7 @@ function setUp() {
       'label' => 'hidden',
       'settings' => array('format_type' => 'medium'),
     );
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
+    entity_get_display($this->instance->entity_type, $this->instance->bundle, 'full')
       ->setComponent($this->field['field_name'], $this->display_options)
       ->save();
   }
@@ -118,8 +118,8 @@ function testDateField() {
       foreach ($values as $new_value) {
         // Update the entity display settings.
         $this->display_options['settings'] = array($setting => $new_value);
-        $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
-          ->setComponent($this->instance['field_name'], $this->display_options)
+        $display = entity_get_display($this->instance->entity_type, $this->instance->bundle, 'full')
+          ->setComponent($this->instance->getFieldId(), $this->display_options)
           ->save();
 
         $this->renderTestEntity($id);
@@ -136,8 +136,8 @@ function testDateField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
-    $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
-      ->setComponent($this->instance['field_name'], $this->display_options)
+    $display = entity_get_display($this->instance->entity_type, $this->instance->bundle, 'full')
+      ->setComponent($this->instance->getFieldId(), $this->display_options)
       ->save();
     $expected = $date->format(DATETIME_DATE_STORAGE_FORMAT);
     $this->renderTestEntity($id);
@@ -185,8 +185,8 @@ function testDatetimeField() {
       foreach ($values as $new_value) {
         // Update the entity display settings.
         $this->display_options['settings'] = array($setting => $new_value);
-        $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
-          ->setComponent($this->instance['field_name'], $this->display_options)
+        $display = entity_get_display($this->instance->entity_type, $this->instance->bundle, 'full')
+          ->setComponent($this->instance->getFieldId(), $this->display_options)
           ->save();
 
         $this->renderTestEntity($id);
@@ -203,8 +203,8 @@ function testDatetimeField() {
 
     // Verify that the plain formatter works.
     $this->display_options['type'] = 'datetime_plain';
-    $display = entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'full')
-      ->setComponent($this->instance['field_name'], $this->display_options)
+    $display = entity_get_display($this->instance->entity_type, $this->instance->bundle, 'full')
+      ->setComponent($this->instance->getFieldId(), $this->display_options)
       ->save();
     $expected = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
     $this->renderTestEntity($id);
@@ -221,8 +221,8 @@ function testDatelistWidget() {
     field_update_field($this->field);
 
     // Change the widget to a datelist widget.
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'], array(
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId(), array(
         'type' => 'datetime_datelist',
         'settings' => array(
           'increment' => 1,
@@ -286,8 +286,8 @@ function testDefaultValue() {
     field_update_field($this->field);
 
     // Set the default value to 'now'.
-    $this->instance['settings']['default_value'] = 'now';
-    $this->instance['default_value_function'] = 'datetime_default_value';
+    $this->instance->settings['default_value'] = 'now';
+    $this->instance->default_value_function = 'datetime_default_value';
     field_update_instance($this->instance);
 
     // Display creation form.
@@ -304,8 +304,8 @@ function testDefaultValue() {
     $this->assertNoFieldByName("{$this->field['field_name']}[$langcode][0][value][time]", '', 'Time element found.');
 
     // Set the default value to 'blank'.
-    $this->instance['settings']['default_value'] = 'blank';
-    $this->instance['default_value_function'] = 'datetime_default_value';
+    $this->instance->settings['default_value'] = 'blank';
+    $this->instance->default_value_function = 'datetime_default_value';
     field_update_instance($this->instance);
 
     // Display creation form.
diff --git a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
index c075b4c..a723c17 100644
--- a/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
+++ b/core/modules/edit/lib/Drupal/edit/Form/EditFieldForm.php
@@ -106,7 +106,7 @@ protected function buildEntity(array $form, array &$form_state) {
     //   types: http://drupal.org/node/1678002.
     if ($entity->entityType() == 'node' && $entity->isNewRevision() && !isset($entity->log)) {
       $instance = field_info_instance($entity->entityType(), $form_state['field_name'], $entity->bundle());
-      $entity->log = t('Updated the %field-name field through in-place editing.', array('%field-name' => $instance['label']));
+      $entity->log = t('Updated the %field-name field through in-place editing.', array('%field-name' => $instance->label));
     }
 
     return $entity;
diff --git a/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php b/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
index cecc676..b9ba7ad 100644
--- a/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
+++ b/core/modules/edit/lib/Drupal/edit/MetadataGenerator.php
@@ -59,7 +59,7 @@ public function __construct(EditEntityFieldAccessCheckInterface $access_checker,
    * Implements \Drupal\edit\MetadataGeneratorInterface::generate().
    */
   public function generate(EntityInterface $entity, FieldInstance $instance, $langcode, $view_mode) {
-    $field_name = $instance['field_name'];
+    $field_name = $instance->getFieldId();
 
     // Early-return if user does not have access.
     $access = $this->accessChecker->accessEditEntityField($entity, $field_name);
@@ -68,7 +68,7 @@ public function generate(EntityInterface $entity, FieldInstance $instance, $lang
     }
 
     // Early-return if no editor is available.
-    $formatter_id = entity_get_render_display($entity, $view_mode)->getFormatter($instance['field_name'])->getPluginId();
+    $formatter_id = entity_get_render_display($entity, $view_mode)->getFormatter($instance->getFieldId())->getPluginId();
     $items = $entity->getTranslation($langcode, FALSE)->get($field_name)->getValue();
     $editor_id = $this->editorSelector->getEditor($formatter_id, $instance, $items);
     if (!isset($editor_id)) {
@@ -76,7 +76,7 @@ public function generate(EntityInterface $entity, FieldInstance $instance, $lang
     }
 
     // Gather metadata, allow the editor to add additional metadata of its own.
-    $label = $instance['label'];
+    $label = $instance->label;
     $editor = $this->editorManager->createInstance($editor_id);
     $metadata = array(
       'label' => check_plain($label),
diff --git a/core/modules/edit/lib/Drupal/edit/Plugin/InPlaceEditor/DirectEditor.php b/core/modules/edit/lib/Drupal/edit/Plugin/InPlaceEditor/DirectEditor.php
index f4eedd6..681d951 100644
--- a/core/modules/edit/lib/Drupal/edit/Plugin/InPlaceEditor/DirectEditor.php
+++ b/core/modules/edit/lib/Drupal/edit/Plugin/InPlaceEditor/DirectEditor.php
@@ -28,14 +28,14 @@ class DirectEditor extends EditorBase {
    *   how to generalize to other textual field types.
    */
   function isCompatible(FieldInstance $instance, array $items) {
-    $field = field_info_field($instance['field_name']);
+    $field = field_info_field($instance->getFieldId());
 
     // This editor is incompatible with multivalued fields.
     if ($field['cardinality'] != 1) {
       return FALSE;
     }
     // This editor is incompatible with processed ("rich") text fields.
-    elseif (!empty($instance['settings']['text_processing'])) {
+    elseif (!empty($instance->settings['text_processing'])) {
       return FALSE;
     }
     else {
diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
index 432c2be..cd51662 100644
--- a/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
+++ b/core/modules/edit/lib/Drupal/edit/Tests/EditorSelectionTest.php
@@ -79,12 +79,12 @@ function testText() {
     $this->assertEqual('direct', $this->getSelectedEditor($items, $field_name), "Without text processing, cardinality 1, the 'direct' editor is selected.");
 
     // Editor selection with text processing, cardinality 1.
-    $this->field_text_instance['settings']['text_processing'] = 1;
+    $this->field_text_instance->settings['text_processing'] = 1;
     field_update_instance($this->field_text_instance);
     $this->assertEqual('form', $this->getSelectedEditor($items, $field_name), "With text processing, cardinality 1, the 'form' editor is selected.");
 
     // Editor selection without text processing, cardinality 1 (again).
-    $this->field_text_instance['settings']['text_processing'] = 0;
+    $this->field_text_instance->settings['text_processing'] = 0;
     field_update_instance($this->field_text_instance);
     $this->assertEqual('direct', $this->getSelectedEditor($items, $field_name), "Without text processing again, cardinality 1, the 'direct' editor is selected.");
 
@@ -95,7 +95,7 @@ function testText() {
     $this->assertEqual('form', $this->getSelectedEditor($items, $field_name), "Without text processing, cardinality >1, the 'form' editor is selected.");
 
     // Editor selection with text processing, cardinality >1
-    $this->field_text_instance['settings']['text_processing'] = 1;
+    $this->field_text_instance->settings['text_processing'] = 1;
     field_update_instance($this->field_text_instance);
     $this->assertEqual('form', $this->getSelectedEditor($items, $field_name), "With text processing, cardinality >1, the 'form' editor is selected.");
   }
diff --git a/core/modules/edit/tests/modules/lib/Drupal/edit_test/Plugin/InPlaceEditor/WysiwygEditor.php b/core/modules/edit/tests/modules/lib/Drupal/edit_test/Plugin/InPlaceEditor/WysiwygEditor.php
index c0e3e4e..68f0387 100644
--- a/core/modules/edit/tests/modules/lib/Drupal/edit_test/Plugin/InPlaceEditor/WysiwygEditor.php
+++ b/core/modules/edit/tests/modules/lib/Drupal/edit_test/Plugin/InPlaceEditor/WysiwygEditor.php
@@ -26,7 +26,7 @@ class WysiwygEditor extends EditorBase {
    * Implements \Drupal\edit\EditPluginInterface::isCompatible().
    */
   function isCompatible(FieldInstance $instance, array $items) {
-    $field = field_info_field($instance['field_name']);
+    $field = field_info_field($instance->getFieldId());
 
     // This editor is incompatible with multivalued fields.
     if ($field['cardinality'] != 1) {
@@ -35,7 +35,7 @@ function isCompatible(FieldInstance $instance, array $items) {
     // This editor is compatible with processed ("rich") text fields; but only
     // if there is a currently active text format and that text format is the
     // 'full_html' text format.
-    elseif (!empty($instance['settings']['text_processing'])) {
+    elseif (!empty($instance->settings['text_processing'])) {
       $format_id = $items[0]['format'];
       if (isset($format_id) && $format_id === 'full_html') {
         return TRUE;
diff --git a/core/modules/editor/lib/Drupal/editor/Plugin/InPlaceEditor/Editor.php b/core/modules/editor/lib/Drupal/editor/Plugin/InPlaceEditor/Editor.php
index 0a056fb..00d33e7 100644
--- a/core/modules/editor/lib/Drupal/editor/Plugin/InPlaceEditor/Editor.php
+++ b/core/modules/editor/lib/Drupal/editor/Plugin/InPlaceEditor/Editor.php
@@ -28,7 +28,7 @@ class Editor extends PluginBase implements EditPluginInterface {
    * Implements \Drupal\edit\Plugin\EditPluginInterface::isCompatible().
    */
   function isCompatible(FieldInstance $instance, array $items) {
-    $field = field_info_field($instance['field_name']);
+    $field = field_info_field($instance->getFieldId());
 
     // This editor is incompatible with multivalued fields.
     if ($field['cardinality'] != 1) {
@@ -37,7 +37,7 @@ function isCompatible(FieldInstance $instance, array $items) {
     // This editor is compatible with processed ("rich") text fields; but only
     // if there is a currently active text format, that text format has an
     // associated editor and that editor supports inline editing.
-    elseif (!empty($instance['settings']['text_processing'])) {
+    elseif (!empty($instance->settings['text_processing'])) {
       $format_id = $items[0]['format'];
       if (isset($format_id) && $editor = editor_load($format_id)) {
         $definition = drupal_container()->get('plugin.manager.editor')->getDefinition($editor->editor);
diff --git a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php
index 0a7ff40..73ab80f 100644
--- a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php
+++ b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php
@@ -220,7 +220,7 @@ public function setComponent($name, array $options = array()) {
     }
 
     if ($instance = field_info_instance($this->targetEntityType, $name, $this->bundle)) {
-      $field = field_info_field($instance['field_name']);
+      $field = field_info_field($instance->getFieldId());
       $options = $this->pluginManager->prepareConfiguration($field['type'], $options);
 
       // Clear the persisted plugin, if any.
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index 3c68c46..5d02219 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -112,8 +112,8 @@ function entity_reference_field_presave(EntityInterface $entity, $field, $instan
   $bundles = entity_get_bundles($target_type);
 
   // Get the bundle.
-  if (!empty($instance['settings']['handler_settings']['target_bundles']) && count($instance['settings']['handler_settings']['target_bundles']) == 1) {
-    $bundle = reset($instance['settings']['handler_settings']['target_bundles']);
+  if (!empty($instance->settings['handler_settings']['target_bundles']) && count($instance->settings['handler_settings']['target_bundles']) == 1) {
+    $bundle = reset($instance->settings['handler_settings']['target_bundles']);
   }
   else {
     $bundle = reset($bundles);
@@ -217,7 +217,7 @@ function entity_reference_field_update_field($field, $prior_field, $has_data) {
   foreach ($field['bundles'] as $entity_type => $bundles) {
     foreach ($bundles as $bundle) {
       $instance = field_info_instance($entity_type, $field_name, $bundle);
-      $instance['settings']['handler_settings'] = array();
+      $instance->settings['handler_settings'] = array();
       field_update_instance($instance);
     }
   }
@@ -230,7 +230,7 @@ function entity_reference_field_instance_settings_form($field, $instance, $form_
   $field = isset($form_state['entity_reference']['field']) ? $form_state['entity_reference']['field'] : $field;
   $instance = isset($form_state['entity_reference']['instance']) ? $form_state['entity_reference']['instance'] : $instance;
 
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
   $settings += array('handler' => 'default');
 
   // Get all selection plugins for this entity type.
@@ -357,7 +357,7 @@ function _entity_reference_element_validate_filter(&$element, &$form_state) {
 function _entity_reference_field_instance_settings_validate($form, &$form_state) {
   $instance = $form['#instance'];
   if (isset($form_state['values']['instance'])) {
-    $instance['settings'] = $form_state['values']['instance']['settings'];
+    $instance->settings = $form_state['values']['instance']['settings'];
   }
   $form_state['entity_reference']['instance'] = $instance;
 
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php
index 6168bea..4305430 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php
@@ -75,7 +75,7 @@ public function getMatches($field, $instance, $entity_type, $entity_id = '', $pr
 
     if (isset($string)) {
       // Get an array of matching entities.
-      $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']);
+      $widget = entity_get_form_display($instance->entity_type, $instance->bundle, 'default')->getComponent($instance->getFieldId());
       $match_operator = !empty($widget['settings']['match_operator']) ? $widget['settings']['match_operator'] : 'CONTAINS';
       $entity_labels = $handler->getReferencableEntities($string, $match_operator, 10);
 
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
index ab60905..f640aff 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php
@@ -67,10 +67,10 @@ public static function settingsForm(&$field, &$instance) {
     $bundles = entity_get_bundles($field['settings']['target_type']);
 
     // Merge-in default values.
-    if (!isset($instance['settings']['handler_settings'])) {
-      $instance['settings']['handler_settings'] = array();
+    if (!isset($instance->settings['handler_settings'])) {
+      $instance->settings['handler_settings'] = array();
     }
-    $instance['settings']['handler_settings'] += array(
+    $instance->settings['handler_settings'] += array(
       'target_bundles' => array(),
       'sort' => array(
         'field' => '_none',
@@ -97,7 +97,7 @@ public static function settingsForm(&$field, &$instance) {
         '#type' => 'checkboxes',
         '#title' => $target_bundles_title,
         '#options' => $bundle_options,
-        '#default_value' => (!empty($instance['settings']['handler_settings']['target_bundles'])) ? $instance['settings']['handler_settings']['target_bundles'] : array(),
+        '#default_value' => (!empty($instance->settings['handler_settings']['target_bundles'])) ? $instance->settings['handler_settings']['target_bundles'] : array(),
         '#required' => TRUE,
         '#size' => 6,
         '#multiple' => TRUE,
@@ -131,7 +131,7 @@ public static function settingsForm(&$field, &$instance) {
       ) + $fields,
       '#ajax' => TRUE,
       '#limit_validation_errors' => array(),
-      '#default_value' => $instance['settings']['handler_settings']['sort']['field'],
+      '#default_value' => $instance->settings['handler_settings']['sort']['field'],
     );
 
     $form['sort']['settings'] = array(
@@ -140,9 +140,9 @@ public static function settingsForm(&$field, &$instance) {
       '#process' => array('_entity_reference_form_process_merge_parent'),
     );
 
-    if ($instance['settings']['handler_settings']['sort']['field'] != '_none') {
+    if ($instance->settings['handler_settings']['sort']['field'] != '_none') {
       // Merge-in default values.
-      $instance['settings']['handler_settings']['sort'] += array(
+      $instance->settings['handler_settings']['sort'] += array(
         'direction' => 'ASC',
       );
 
@@ -154,7 +154,7 @@ public static function settingsForm(&$field, &$instance) {
           'ASC' => t('Ascending'),
           'DESC' => t('Descending'),
         ),
-        '#default_value' => $instance['settings']['handler_settings']['sort']['direction'],
+        '#default_value' => $instance->settings['handler_settings']['sort']['direction'],
       );
     }
 
@@ -268,8 +268,8 @@ public function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
     $entity_info = entity_get_info($target_type);
 
     $query = \Drupal::entityQuery($target_type);
-    if (!empty($this->instance['settings']['handler_settings']['target_bundles'])) {
-      $query->condition($entity_info['entity_keys']['bundle'], $this->instance['settings']['handler_settings']['target_bundles'], 'IN');
+    if (!empty($this->instance->settings['handler_settings']['target_bundles'])) {
+      $query->condition($entity_info['entity_keys']['bundle'], $this->instance->settings['handler_settings']['target_bundles'], 'IN');
     }
 
     if (isset($match) && isset($entity_info['entity_keys']['label'])) {
@@ -286,8 +286,8 @@ public function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
     $query->addMetaData('entity_reference_selection_handler', $this);
 
     // Add the sort option.
-    if (!empty($this->instance['settings']['handler_settings']['sort'])) {
-      $sort_settings = $this->instance['settings']['handler_settings']['sort'];
+    if (!empty($this->instance->settings['handler_settings']['sort'])) {
+      $sort_settings = $this->instance->settings['handler_settings']['sort'];
       if ($sort_settings['field'] != '_none') {
         $query->sort($sort_settings['field'], $sort_settings['direction']);
       }
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
index a88f2ea..84a5c41 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php
@@ -41,7 +41,7 @@ public function elementValidate($element, &$form_state, $form) {
     // If a value was entered into the autocomplete.
     $handler = entity_reference_get_selection_handler($this->field, $this->instance);
     $bundles = entity_get_bundles($this->field['settings']['target_type']);
-    $auto_create = isset($this->instance['settings']['handler_settings']['auto_create']) ? $this->instance['settings']['handler_settings']['auto_create'] : FALSE;
+    $auto_create = isset($this->instance->settings['handler_settings']['auto_create']) ? $this->instance->settings['handler_settings']['auto_create'] : FALSE;
 
     if (!empty($element['#value'])) {
       $entities = drupal_explode_tags($element['#value']);
@@ -62,7 +62,7 @@ public function elementValidate($element, &$form_state, $form) {
         if ($match) {
           $value[] = array('target_id' => $match);
         }
-        elseif ($auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1 || count($bundles) == 1)) {
+        elseif ($auto_create && (count($this->instance->settings['handler_settings']['target_bundles']) == 1 || count($bundles) == 1)) {
           // Auto-create item. see entity_reference_field_presave().
           $value[] = array('target_id' => 'auto_create', 'label' => $entity);
         }
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
index 57c4b7b..f2a18e7 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php
@@ -57,7 +57,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
    * Overrides \Drupal\entity_reference\Plugin\field\widget\AutocompleteWidgetBase::elementValidate()
    */
   public function elementValidate($element, &$form_state, $form) {
-    $auto_create = isset($this->instance['settings']['handler_settings']['auto_create']) ? $this->instance['settings']['handler_settings']['auto_create'] : FALSE;
+    $auto_create = isset($this->instance->settings['handler_settings']['auto_create']) ? $this->instance->settings['handler_settings']['auto_create'] : FALSE;
 
     // If a value was entered into the autocomplete.
     $value = '';
@@ -73,7 +73,7 @@ public function elementValidate($element, &$form_state, $form) {
         $value = $handler->validateAutocompleteInput($element['#value'], $element, $form_state, $form, !$auto_create);
       }
 
-      if (!$value && $auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1)) {
+      if (!$value && $auto_create && (count($this->instance->settings['handler_settings']['target_bundles']) == 1)) {
         // Auto-create item. see entity_reference_field_presave().
         $value = array(
           'target_id' => 'auto_create',
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
index 6a8df6f..74efcec 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php
@@ -59,7 +59,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
 
     // Prepare the autocomplete path.
     $autocomplete_path = $this->getSetting('autocomplete_path');
-    $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'] . '/';
+    $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance->entity_type . '/' . $instance->bundle . '/';
 
     // Use <NULL> as a placeholder in the URL when we don't have an entity.
     // Most web servers collapse two consecutive slashes.
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
index d3245e0..17c7a1b 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php
@@ -131,7 +131,7 @@ public function testSort() {
     $this->assertIdentical($result['article'], $expected_result, 'Query sorted by field returned expected values.');
 
     // Assert sort by property.
-    $instance['settings']['handler_settings']['sort'] = array(
+    $instance->settings['handler_settings']['sort'] = array(
       'field' => 'nid',
       'direction' => 'ASC',
     );
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 75a99df..0979be2 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -403,7 +403,7 @@ function hook_field_validate(\Drupal\Core\Entity\EntityInterface $entity = NULL,
       if (!empty($field['settings']['max_length']) && drupal_strlen($item['value']) > $field['settings']['max_length']) {
         $errors[$field['field_name']][$langcode][$delta][] = array(
           'error' => 'text_max_length',
-          'message' => t('%name: the value may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length'])),
+          'message' => t('%name: the value may not be longer than %max characters.', array('%name' => $instance->label, '%max' => $field['settings']['max_length'])),
         );
       }
     }
@@ -1436,8 +1436,8 @@ function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $
  */
 function hook_field_storage_delete(\Drupal\Core\Entity\EntityInterface $entity, $fields) {
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    if (isset($fields[$instance['field_id']])) {
-      $field = field_info_field_by_id($instance['field_id']);
+    if (isset($fields[$instance->field_uuid])) {
+      $field = field_info_field_by_id($instance->field_uuid);
       field_sql_storage_field_storage_purge($entity, $field, $instance);
     }
   }
@@ -1644,18 +1644,18 @@ function hook_field_storage_delete_field($field) {
  *   The instance being deleted.
  */
 function hook_field_storage_delete_instance($instance) {
-  $field = field_info_field($instance['field_name']);
+  $field = field_info_field($instance->getFieldId());
   $table_name = _field_sql_storage_tablename($field);
   $revision_name = _field_sql_storage_revision_tablename($field);
   db_update($table_name)
     ->fields(array('deleted' => 1))
-    ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('entity_type', $instance->entity_type)
+    ->condition('bundle', $instance->bundle)
     ->execute();
   db_update($revision_name)
     ->fields(array('deleted' => 1))
-    ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('entity_type', $instance->entity_type)
+    ->condition('bundle', $instance->bundle)
     ->execute();
 }
 
@@ -2003,7 +2003,7 @@ function hook_field_purge_field($field) {
  */
 function hook_field_purge_instance($instance) {
   db_delete('my_module_field_instance_info')
-    ->condition('id', $instance['id'])
+    ->condition('id', $instance->id)
     ->execute();
 }
 
@@ -2034,7 +2034,7 @@ function hook_field_storage_purge_field($field) {
  */
 function hook_field_storage_purge_field_instance($instance) {
   db_delete('my_module_field_instance_info')
-    ->condition('id', $instance['id'])
+    ->condition('id', $instance->id)
     ->execute();
 }
 
diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc
index baa7ff4..9e1003d 100644
--- a/core/modules/field/field.attach.inc
+++ b/core/modules/field/field.attach.inc
@@ -171,7 +171,7 @@ function field_invoke_method($method, $target_function, EntityInterface $entity,
     $target = call_user_func($target_function, $instance);
 
     if (method_exists($target, $method)) {
-      $field = field_info_field_by_id($instance['field_id']);
+      $field = field_info_field_by_id($instance->field_uuid);
       $field_name = $field['field_name'];
 
       // Determine the list of languages to iterate on.
@@ -266,8 +266,8 @@ function field_invoke_method_multiple($method, $target_function, array $entities
     $entity_instances = _field_invoke_get_instances($entity_type, $entity->bundle(), $options);
 
     foreach ($entity_instances as $instance) {
-      $instance_id = $instance['id'];
-      $field_name = $instance['field_name'];
+      $instance_id = $instance->id;
+      $field_name = $instance->getFieldId();
 
       // Let the closure determine the target object on which the method should
       // be called.
@@ -283,7 +283,7 @@ function field_invoke_method_multiple($method, $target_function, array $entities
 
         // Unless a language code suggestion is provided we iterate on all the
         // available language codes.
-        $field = field_info_field_by_id($instance['field_id']);
+        $field = field_info_field_by_id($instance->field_uuid);
         $available_langcodes = field_available_languages($entity_type, $field);
         $langcode = !empty($options['langcode'][$id]) ? $options['langcode'][$id] : $options['langcode'];
         $langcodes = _field_language_suggestion($available_langcodes, $langcode, $field_name);
@@ -300,7 +300,7 @@ function field_invoke_method_multiple($method, $target_function, array $entities
 
   // For each instance, invoke the method and collect results.
   foreach ($instances as $instance_id => $instance) {
-    $field_name = $instance['field_name'];
+    $field_name = $instance->getFieldId();
 
     // Iterate over all the field translations.
     foreach ($grouped_items[$instance_id] as $langcode => &$items) {
@@ -401,7 +401,7 @@ function _field_invoke($op, EntityInterface $entity, &$a = NULL, &$b = NULL, $op
   foreach ($instances as $instance) {
     // field_info_field() is not available for deleted fields, so use
     // field_info_field_by_id().
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     $field_name = $field['field_name'];
     $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
     if (function_exists($function)) {
@@ -509,8 +509,8 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b =
     $id = $entity->id();
 
     foreach ($instances as $instance) {
-      $field_id = $instance['field_id'];
-      $field_name = $instance['field_name'];
+      $field_id = $instance->field_uuid;
+      $field_name = $instance->getFieldId();
       $field = field_info_field_by_id($field_id);
       $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
       if (function_exists($function)) {
@@ -671,11 +671,11 @@ function _field_invoke_get_instances($entity_type, $bundle, $options) {
     // Deleted fields are not included in field_info_instances(), and need to
     // be fetched from the database with field_read_instances().
     $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
-    if (isset($options['field_id'])) {
+    if (isset($options->field_uuid)) {
       // Single-field mode by field id: field_read_instances() does the filtering.
       // Single-field mode by field name is not compatible with the 'deleted'
       // option.
-      $params['field_id'] = $options['field_id'];
+      $params->field_uuid = $options->field_uuid;
     }
     $instances = field_read_instances($params, array('include_deleted' => TRUE));
   }
@@ -686,11 +686,11 @@ function _field_invoke_get_instances($entity_type, $bundle, $options) {
   }
   else {
     $instances = field_info_instances($entity_type, $bundle);
-    if (isset($options['field_id'])) {
+    if (isset($options->field_uuid)) {
       // Single-field mode by field id: we need to loop on each instance to
       // find the right one.
       foreach ($instances as $instance) {
-        if ($instance['field_id'] == $options['field_id']) {
+        if ($instance->field_uuid == $options->field_uuid) {
           $instances = array($instance);
           break;
         }
@@ -714,7 +714,7 @@ function _field_invoke_get_instances($entity_type, $bundle, $options) {
  */
 function _field_invoke_widget_target($form_display) {
   return function ($instance) use ($form_display) {
-    return $form_display->getWidget($instance['field_name']);
+    return $form_display->getWidget($instance->getFieldId());
   };
 }
 
@@ -790,7 +790,7 @@ function _field_invoke_widget_target($form_display) {
  *
  *       // Only for multiple widgets:
  *       '#entity_type' => The name of the entity type,
- *       '#bundle' => $instance['bundle'],
+ *       '#bundle' => $instance->bundle,
  *       '#columns'  => array_keys($field['columns']),
  *       // The remaining elements in the sub-array depend on the widget.
  *       '#type' => The type of the widget,
@@ -895,7 +895,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
   // types can be cached.
   $cache_read = $load_current && $info['field_cache'] && empty($options['deleted']);
   // In addition, do not write to the cache when loading a single field.
-  $cache_write = $cache_read && !isset($options['field_id']);
+  $cache_write = $cache_read && !isset($options->field_uuid);
 
   if (empty($entities)) {
     return;
@@ -956,8 +956,8 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
       $id = $entity->id();
       $vid = $entity->getRevisionId();
       foreach ($instances as $instance) {
-        $field_name = $instance['field_name'];
-        $field_id = $instance['field_id'];
+        $field_name = $instance->getFieldId();
+        $field_id = $instance->field_uuid;
         // Make sure all fields are present at least as empty arrays.
         if (!isset($queried_entities[$id]->{$field_name})) {
           $queried_entities[$id]->{$field_name} = array();
@@ -990,7 +990,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
         $data = array();
         $instances = field_info_instances($entity_type, $entity->bundle());
         foreach ($instances as $instance) {
-          $data[$instance['field_name']] = $queried_entities[$id]->{$instance['field_name']};
+          $data[$instance->getFieldId()] = $queried_entities[$id]->{$instance->getFieldId()};
         }
         $cid = "field:$entity_type:$id";
         cache('field')->set($cid, $data);
@@ -1200,7 +1200,7 @@ function field_attach_insert(EntityInterface $entity) {
   // Collect the storage backends used by the remaining fields in the entities.
   $storages = array();
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     $field_id = $field['uuid'];
     $field_name = $field['field_name'];
     if (!empty($entity->$field_name)) {
@@ -1244,7 +1244,7 @@ function field_attach_update(EntityInterface $entity) {
   // Collect the storage backends used by the remaining fields in the entities.
   $storages = array();
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     $field_id = $field['uuid'];
     $field_name = $field['field_name'];
     // Leave the field untouched if $entity comes with no $field_name property,
@@ -1290,7 +1290,7 @@ function field_attach_delete(EntityInterface $entity) {
   // Collect the storage backends used by the fields in the entities.
   $storages = array();
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     $field_id = $field['uuid'];
     $storages[$field['storage']['type']][$field_id] = $field_id;
   }
@@ -1326,7 +1326,7 @@ function field_attach_delete_revision(EntityInterface $entity) {
   // Collect the storage backends used by the fields in the entities.
   $storages = array();
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     $field_id = $field['uuid'];
     $storages[$field['storage']['type']][$field_id] = $field_id;
   }
@@ -1399,8 +1399,8 @@ function field_attach_prepare_view($entity_type, array $entities, array $display
   // instance, call the prepareView() method on the formatter object handed by
   // the entity display.
   $target_function = function ($instance) use ($displays) {
-    if (isset($displays[$instance['bundle']])) {
-      return $displays[$instance['bundle']]->getFormatter($instance['field_name']);
+    if (isset($displays[$instance->bundle])) {
+      return $displays[$instance->bundle]->getFormatter($instance->getFieldId());
     }
   };
   field_invoke_method_multiple('prepareView', $target_function, $prepare, $null, $null, $options);
@@ -1463,7 +1463,7 @@ function field_attach_view(EntityInterface $entity, EntityDisplay $display, $lan
   // For each instance, call the view() method on the formatter object handed
   // by the entity display.
   $target_function = function ($instance) use ($display) {
-    return $display->getFormatter($instance['field_name']);
+    return $display->getFormatter($instance->getFieldId());
   };
   $null = NULL;
   $output = field_invoke_method('view', $target_function, $entity, $null, $null, $options);
@@ -1508,7 +1508,7 @@ function field_attach_preprocess(EntityInterface $entity, $element, &$variables)
   // Ensure we are working with a BC mode entity.
   $entity = $entity->getBCEntity();
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    $field_name = $instance['field_name'];
+    $field_name = $instance->getFieldId();
     if (isset($element[$field_name]['#language'])) {
       $langcode = $element[$field_name]['#language'];
       $variables[$field_name] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : NULL;
@@ -1577,7 +1577,7 @@ function field_entity_bundle_rename($entity_type, $bundle_old, $bundle_new) {
   $instances = field_read_instances();
   foreach ($instances as $instance) {
     if ($instance->entity_type == $entity_type && $instance->bundle == $bundle_old) {
-      $id_new = $instance['entity_type'] . '.' . $bundle_new . '.' . $instance['field_name'];
+      $id_new = $instance->entity_type . '.' . $bundle_new . '.' . $instance->getFieldId();
       $instance->id = $id_new;
       $instance->bundle = $bundle_new;
       $instance->allowBundleRename();
diff --git a/core/modules/field/field.crud.inc b/core/modules/field/field.crud.inc
index ec2daa3..38dfb56 100644
--- a/core/modules/field/field.crud.inc
+++ b/core/modules/field/field.crud.inc
@@ -297,7 +297,7 @@ function field_create_instance(array $instance) {
 function field_update_instance($instance) {
   // Module developers can still pass in an array of properties.
   if (is_array($instance)) {
-    $instance_loaded = entity_load('field_instance', $instance['entity_type'] . '.' . $instance['bundle'] . '.' . $instance['field_name']);
+    $instance_loaded = entity_load('field_instance', $instance->entity_type . '.' . $instance->bundle . '.' . $instance->getFieldId());
     if (empty($instance_loaded)) {
       throw new FieldException('Attempt to update a non-existent instance.');
     }
@@ -547,7 +547,7 @@ function field_purge_batch($batch_size) {
   $factory = Drupal::service('entity.query');
   $info = entity_get_info();
   foreach ($instances as $instance) {
-    $entity_type = $instance['entity_type'];
+    $entity_type = $instance->entity_type;
 
     // EntityFieldQuery currently fails on conditions on comment bundle.
     // Remove when http://drupal.org/node/731724 is fixed.
@@ -557,10 +557,10 @@ function field_purge_batch($batch_size) {
 
     $ids = (object) array(
       'entity_type' => $entity_type,
-      'bundle' => $instance['bundle'],
+      'bundle' => $instance->bundle,
     );
     // field_purge_data() will need the field array.
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     // Retrieve some entities.
     $query = $factory->get($entity_type)
       ->condition('id:' . $field['uuid'] . '.deleted', 1)
@@ -621,7 +621,7 @@ function field_purge_batch($batch_size) {
 function field_purge_data(EntityInterface $entity, $field, $instance) {
   // Each field type's hook_field_delete() only expects to operate on a single
   // field at a time, so we can use it as-is for purging.
-  $options = array('field_id' => $instance['field_id'], 'deleted' => TRUE);
+  $options = array('field_id' => $instance->field_uuid, 'deleted' => TRUE);
   _field_invoke('delete', $entity, $dummy, $dummy, $options);
 
   // Tell the field storage system to purge the data.
@@ -645,12 +645,12 @@ function field_purge_data(EntityInterface $entity, $field, $instance) {
  */
 function field_purge_instance($instance) {
   // Notify the storage engine.
-  $field = field_info_field_by_id($instance['field_id']);
+  $field = field_info_field_by_id($instance->field_uuid);
   module_invoke($field['storage']['module'], 'field_storage_purge_instance', $instance);
 
   $state = Drupal::state();
   $deleted_instances = $state->get('field.instance.deleted');
-  unset($deleted_instances[$instance['uuid']]);
+  unset($deleted_instances[$instance->uuid]);
   $state->set('field.instance.deleted', $deleted_instances);
 
   // Clear the cache.
diff --git a/core/modules/field/field.default.inc b/core/modules/field/field.default.inc
index ab6b10e..d676a41 100644
--- a/core/modules/field/field.default.inc
+++ b/core/modules/field/field.default.inc
@@ -50,7 +50,7 @@ function field_default_validate(EntityInterface $entity, $field, $instance, $lan
   if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && count($items) > $field['cardinality']) {
     $errors[$field['field_name']][$langcode][0][] = array(
       'error' => 'field_cardinality',
-      'message' => t('%name: this field cannot hold more than @count values.', array('%name' => $instance['label'], '@count' => $field['cardinality'])),
+      'message' => t('%name: this field cannot hold more than @count values.', array('%name' => $instance->label, '@count' => $field['cardinality'])),
     );
   }
 }
diff --git a/core/modules/field/field.info.inc b/core/modules/field/field.info.inc
index f69649d..976fdbd 100644
--- a/core/modules/field/field.info.inc
+++ b/core/modules/field/field.info.inc
@@ -145,7 +145,7 @@ function _field_info_collate_types_reset() {
  */
 function field_behaviors_widget($op, $instance) {
   $info = array();
-  if ($component = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name'])) {
+  if ($component = entity_get_form_display($instance->entity_type, $instance->bundle, 'default')->getComponent($instance->getFieldId())) {
     $info = field_info_widget_types($component['type']);
   }
   return isset($info[$op]) ? $info[$op] : FIELD_BEHAVIOR_DEFAULT;
diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 5b762b5..282f010 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -485,12 +485,12 @@ function field_sync_field_status() {
  */
 function field_get_default_value(EntityInterface $entity, $field, $instance, $langcode = NULL) {
   $items = array();
-  if (!empty($instance['default_value_function'])) {
-    $function = $instance['default_value_function'];
+  if (!empty($instance->default_value_function)) {
+    $function = $instance->default_value_function;
     $items = $function($entity, $field, $instance, $langcode);
   }
-  elseif (!empty($instance['default_value'])) {
-    $items = $instance['default_value'];
+  elseif (!empty($instance->default_value)) {
+    $items = $instance->default_value;
   }
   return $items;
 }
diff --git a/core/modules/field/field.multilingual.inc b/core/modules/field/field.multilingual.inc
index 6f6e2d6..b202ff2 100644
--- a/core/modules/field/field.multilingual.inc
+++ b/core/modules/field/field.multilingual.inc
@@ -267,17 +267,17 @@ function field_language(EntityInterface $entity, $field_name = NULL, $langcode =
     // if the field translation is not available. It is up to translation
     // handlers to implement language fallback rules.
     foreach (field_info_instances($entity_type, $bundle) as $instance) {
-      if (isset($entity->{$instance['field_name']}[$langcode])) {
-        $display_langcode[$instance['field_name']] = $langcode;
+      if (isset($entity->{$instance->getFieldId()}[$langcode])) {
+        $display_langcode[$instance->getFieldId()] = $langcode;
       }
       else {
         // If the field has a value for one of the locked languages, then use
         // that language for display. If not, the default one will be
         // Language::LANGCODE_NOT_SPECIFIED.
-        $display_langcode[$instance['field_name']] = Language::LANGCODE_NOT_SPECIFIED;
+        $display_langcode[$instance->getFieldId()] = Language::LANGCODE_NOT_SPECIFIED;
         foreach (language_list(Language::STATE_LOCKED) as $language_locked) {
-          if (isset($entity->{$instance['field_name']}[$language_locked->langcode])) {
-            $display_langcode[$instance['field_name']] = $language_locked->langcode;
+          if (isset($entity->{$instance->getFieldId()}[$language_locked->langcode])) {
+            $display_langcode[$instance->getFieldId()] = $language_locked->langcode;
             break;
           }
         }
diff --git a/core/modules/field/lib/Drupal/field/FieldInfo.php b/core/modules/field/lib/Drupal/field/FieldInfo.php
index 6d95788..e1b441a 100644
--- a/core/modules/field/lib/Drupal/field/FieldInfo.php
+++ b/core/modules/field/lib/Drupal/field/FieldInfo.php
@@ -269,9 +269,9 @@ public function getInstances($entity_type = NULL) {
         $this->getFields();
 
         foreach (field_read_instances() as $instance) {
-          $field = $this->getField($instance['field_name']);
+          $field = $this->getField($instance->getFieldId());
           $instance = $this->prepareInstance($instance, $field['type']);
-          $this->bundleInstances[$instance['entity_type']][$instance['bundle']][$instance['field_name']] = $instance;
+          $this->bundleInstances[$instance->entity_type][$instance->bundle][$instance->getFieldId()] = $instance;
         }
 
         // Store in persistent cache.
@@ -440,7 +440,7 @@ public function getBundleInstances($entity_type, $bundle) {
         $loaded_instances = entity_load_multiple('field_instance', array_values($config_ids));
 
         foreach ($loaded_instances as $instance) {
-          $field = $loaded_fields[$instance['field_name']];
+          $field = $loaded_fields[$instance->getFieldId()];
 
           $instance = $this->prepareInstance($instance, $field['type']);
           $instances[$field['field_name']] = $instance;
@@ -473,7 +473,7 @@ public function getBundleInstances($entity_type, $bundle) {
       'fields' => array()
     );
     foreach ($instances as $instance) {
-      $cache['fields'][] = $this->fieldsById[$instance['field_id']];
+      $cache['fields'][] = $this->fieldsById[$instance->field_uuid];
     }
     $this->cacheBackend->set("field_info:bundle:$entity_type:$bundle", $cache, CacheBackendInterface::CACHE_PERMANENT, array('field_info' => TRUE));
 
@@ -551,11 +551,11 @@ public function prepareField($field) {
    */
   public function prepareInstance($instance, $field_type) {
     // Make sure all expected instance settings are present.
-    $instance['settings'] += field_info_instance_settings($field_type);
+    $instance->settings += field_info_instance_settings($field_type);
 
     // Set a default value for the instance.
-    if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && !isset($instance['default_value'])) {
-      $instance['default_value'] = NULL;
+    if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && !isset($instance->default_value)) {
+      $instance->default_value = NULL;
     }
 
     return $instance;
diff --git a/core/modules/field/lib/Drupal/field/FieldInstanceInterface.php b/core/modules/field/lib/Drupal/field/FieldInstanceInterface.php
index c6b8ad6..a71ecd8 100644
--- a/core/modules/field/lib/Drupal/field/FieldInstanceInterface.php
+++ b/core/modules/field/lib/Drupal/field/FieldInstanceInterface.php
@@ -12,7 +12,7 @@
 /**
  * Provides an interface defining a field instance entity.
  */
-interface FieldInstanceInterface extends ConfigEntityInterface, \ArrayAccess, \Serializable {
+interface FieldInstanceInterface extends ConfigEntityInterface, \Serializable {
 
   /**
    * Returns the field entity for this instance.
@@ -23,6 +23,22 @@
   public function getField();
 
   /**
+   * Returns the field id for this instance.
+   *
+   * @return $field_id
+   *   The field id.
+   */
+  public function getFieldId();
+
+  /**
+   * Returns the field type from the field for this instance.
+   *
+   * @return $type
+   *   The field type.
+   */
+  public function getFieldType();
+
+  /**
    * Allows a bundle to be renamed.
    *
    * Renaming a bundle on the instance is allowed when an entity's bundle
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php
index 66d8cbf..0ce07e5 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php
@@ -420,48 +420,22 @@ public function getField() {
   /**
    * {@inheritdoc}
    */
-  public function allowBundleRename() {
-    $this->bundle_rename_allowed = TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function offsetExists($offset) {
-    return (isset($this->{$offset}) || $offset == 'field_id' || $offset == 'field_name');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function &offsetGet($offset) {
-    if ($offset == 'field_id') {
-      return $this->field_uuid;
-    }
-    if ($offset == 'field_name') {
-      return $this->field->id;
-    }
-    return $this->{$offset};
+  public function getFieldId() {
+    return $this->field->id();
   }
 
   /**
    * {@inheritdoc}
    */
-  public function offsetSet($offset, $value) {
-    if ($offset == 'field_id') {
-      $offset = 'field_uuid';
-    }
-    $this->{$offset} = $value;
+  public function getFieldType() {
+    return $this->field->type;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function offsetUnset($offset) {
-    if ($offset == 'field_id') {
-      $offset = 'field_uuid';
-    }
-    unset($this->{$offset});
+  public function allowBundleRename() {
+    $this->bundle_rename_allowed = TRUE;
   }
 
   /**
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
index 6b316ae..6edc58c 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php
@@ -71,7 +71,7 @@ public function __construct($plugin_id, array $plugin_definition, $instance, arr
     parent::__construct(array(), $plugin_id, $plugin_definition);
 
     $this->instance = $instance;
-    $this->field = field_info_field($instance['field_name']);
+    $this->field = field_info_field($instance->getFieldId());
     $this->settings = $settings;
     $this->label = $label;
     $this->viewMode = $view_mode;
@@ -91,7 +91,7 @@ public function view(EntityInterface $entity, $langcode, array $items) {
       $entity_type = $entity->entityType();
       $info = array(
         '#theme' => 'field',
-        '#title' => $instance['label'],
+        '#title' => $instance->label,
         '#access' => field_access('view', $field, $entity->entityType(), $entity),
         '#label_display' => $this->label,
         '#view_mode' => $this->viewMode,
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
index 2260610..0d6ac20 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php
@@ -71,7 +71,7 @@ public function __construct(\Traversable $namespaces) {
   public function getInstance(array $options) {
     $configuration = $options['configuration'];
     $instance = $options['instance'];
-    $field = field_info_field($instance['field_name']);
+    $field = field_info_field($instance->getFieldId());
 
     // Fill in default configuration if needed.
     if (!isset($options['prepare']) || $options['prepare'] == TRUE) {
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 89c212a..85591a5 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
@@ -54,7 +54,7 @@ public function __construct($plugin_id, array $plugin_definition, FieldInstance
     parent::__construct(array(), $plugin_id, $plugin_definition);
 
     $this->instance = $instance;
-    $this->field = field_info_field($instance['field_name']);
+    $this->field = field_info_field($instance->getFieldId());
     $this->settings = $settings;
   }
 
@@ -94,8 +94,8 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f
     if (isset($get_delta) || $definition['multiple_values']) {
       $delta = isset($get_delta) ? $get_delta : 0;
       $element = array(
-        '#title' => check_plain($instance['label']),
-        '#description' => field_filter_xss(\Drupal::token()->replace($instance['description'])),
+        '#title' => check_plain($instance->label),
+        '#description' => field_filter_xss(\Drupal::token()->replace($instance->description)),
       );
       $element = $this->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
 
@@ -184,8 +184,8 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
     $id_prefix = implode('-', array_merge($parents, array($field_name)));
     $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
 
-    $title = check_plain($instance['label']);
-    $description = field_filter_xss(\Drupal::token()->replace($instance['description']));
+    $title = check_plain($instance->label);
+    $description = field_filter_xss(\Drupal::token()->replace($instance->description));
 
     $elements = array();
 
@@ -223,7 +223,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
         '#theme' => 'field_multiple_value_form',
         '#field_name' => $field['field_name'],
         '#cardinality' => $field['cardinality'],
-        '#required' => $instance['required'],
+        '#required' => $instance->required,
         '#title' => $title,
         '#description' => $description,
         '#prefix' => '<div id="' . $wrapper_id . '">',
@@ -268,7 +268,7 @@ protected function formSingleElement(EntityInterface $entity, array $items, $del
       '#field_parents' => $form['#parents'],
       '#columns' => array_keys($field['columns']),
       // Only the first widget should be required.
-      '#required' => $delta == 0 && $instance['required'],
+      '#required' => $delta == 0 && $instance->required,
       '#delta' => $delta,
       '#weight' => $delta,
     );
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 bb85736..ae8a710 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
@@ -69,7 +69,7 @@ public function __construct(\Traversable $namespaces) {
   public function getInstance(array $options) {
     $configuration = $options['configuration'];
     $instance = $options['instance'];
-    $field = field_info_field($instance['field_name']);
+    $field = field_info_field($instance->getFieldId());
 
     // Fill in default configuration if needed.
     if (!isset($options['prepare']) || $options['prepare'] == TRUE) {
diff --git a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
index 7960f82..3d281bf 100644
--- a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php
@@ -303,7 +303,7 @@ function testDeleteField() {
     // Make sure that this field's instance is marked as deleted when it is
     // specifically loaded.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
-    $this->assertTrue(!empty($instance['deleted']), 'An instance for a deleted field is marked for deletion.');
+    $this->assertTrue(!empty($instance->deleted), 'An instance for a deleted field is marked for deletion.');
 
     // Try to load the field normally and make sure it does not show up.
     $field = field_read_field($this->field['field_name']);
@@ -317,7 +317,7 @@ function testDeleteField() {
     $another_field = field_read_field($this->another_field['field_name']);
     $this->assertTrue(!empty($another_field) && empty($another_field['deleted']), 'A non-deleted field is not marked for deletion.');
     $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
-    $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'An instance of a non-deleted field is not marked for deletion.');
+    $this->assertTrue(!empty($another_instance) && empty($another_instance->deleted), 'An instance of a non-deleted field is not marked for deletion.');
 
     // Try to create a new field the same name as a deleted field and
     // write data into it.
@@ -326,10 +326,10 @@ function testDeleteField() {
     $field = field_read_field($this->field['field_name']);
     $this->assertTrue(!empty($field) && empty($field['deleted']), 'A new field with a previously used name is created.');
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
-    $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new instance for a previously used field name is created.');
+    $this->assertTrue(!empty($instance) && empty($instance->deleted), 'A new instance for a previously used field name is created.');
 
     // Save an entity with data for the field
-    $entity = field_test_create_entity(0, 0, $instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $values[0]['value'] = mt_rand(1, 127);
     $entity->{$field['field_name']}[$langcode] = $values;
@@ -381,7 +381,7 @@ function testUpdateField() {
     do {
       // We need a unique ID for our entity. $cardinality will do.
       $id = $cardinality;
-      $entity = field_test_create_entity($id, $id, $instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $instance->bundle);
       // Fill in the entity with more values than $cardinality.
       for ($i = 0; $i < 20; $i++) {
         $entity->field_update[Language::LANGCODE_NOT_SPECIFIED][$i]['value'] = $i;
@@ -389,7 +389,7 @@ function testUpdateField() {
       // Save the entity.
       field_attach_insert($entity);
       // Load back and assert there are $cardinality number of values.
-      $entity = field_test_create_entity($id, $id, $instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $instance->bundle);
       field_attach_load('test_entity', array($id => $entity));
       $this->assertEqual(count($entity->field_update[Language::LANGCODE_NOT_SPECIFIED]), $field['cardinality'], 'Cardinality is kept');
       // Now check the values themselves.
diff --git a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
index 9ca988e..f48a69a 100644
--- a/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/DisplayApiTest.php
@@ -57,11 +57,11 @@ function setUp() {
     field_create_field($this->field);
     field_create_instance($this->instance);
     // Create a display for the default view mode.
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name, $this->display_options['default'])
       ->save();
     // Create a display for the teaser view mode.
-    entity_get_display($this->instance['entity_type'], $this->instance['bundle'], 'teaser')
+    entity_get_display($this->instance->entity_type, $this->instance->bundle, 'teaser')
       ->setComponent($this->field_name, $this->display_options['teaser'])
       ->save();
 
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
index d16b25a..b85f2b0 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachOtherTest.php
@@ -74,7 +74,7 @@ function testFieldAttachView() {
     $entity->content = field_attach_view($entity, $display);
     $output = drupal_render($entity->content);
     $this->content = $output;
-    $this->assertRaw($this->instance['label'], "First field's label is displayed.");
+    $this->assertRaw($this->instance->label, "First field's label is displayed.");
     foreach ($values as $delta => $value) {
       $this->content = $output;
       $this->assertRaw("$formatter_setting|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
@@ -89,7 +89,7 @@ function testFieldAttachView() {
     $entity->content = field_attach_view($entity, $display, $langcode, $options);
     $output = drupal_render($entity->content);
     $this->content = $output;
-    $this->assertNoRaw($this->instance['label'], "First field's label is not displayed.");
+    $this->assertNoRaw($this->instance->label, "First field's label is not displayed.");
     foreach ($values as $delta => $value) {
       $this->content = $output;
       $this->assertNoRaw("$formatter_setting|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
@@ -108,7 +108,7 @@ function testFieldAttachView() {
     $entity->content = field_attach_view($entity, $display);
     $output = drupal_render($entity->content);
     $this->content = $output;
-    $this->assertNoRaw($this->instance['label'], "Hidden label: label is not displayed.");
+    $this->assertNoRaw($this->instance->label, "Hidden label: label is not displayed.");
 
     // Field hidden.
     $entity = clone($entity_init);
@@ -117,7 +117,7 @@ function testFieldAttachView() {
     $entity->content = field_attach_view($entity, $display);
     $output = drupal_render($entity->content);
     $this->content = $output;
-    $this->assertNoRaw($this->instance['label'], "Hidden field: label is not displayed.");
+    $this->assertNoRaw($this->instance->label, "Hidden field: label is not displayed.");
     foreach ($values as $delta => $value) {
       $this->assertNoRaw("$formatter_setting|{$value['value']}", "Hidden field: value $delta is not displayed.");
     }
@@ -237,7 +237,7 @@ function testFieldAttachPrepareViewMultiple() {
    */
   function testFieldAttachCache() {
     // Initialize random values and a test entity.
-    $entity_init = field_test_create_entity(1, 1, $this->instance['bundle']);
+    $entity_init = field_test_create_entity(1, 1, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
 
@@ -265,11 +265,11 @@ function testFieldAttachCache() {
     $entity_init = entity_create($entity_type, array(
       'ftid' => 1,
       'ftvid' => 1,
-      'fttype' => $this->instance['bundle'],
+      'fttype' => $this->instance->bundle,
     ));
     $cid = "field:$entity_type:{$entity_init->ftid}";
     $instance = $this->instance;
-    $instance['entity_type'] = $entity_type;
+    $instance->entity_type = $entity_type;
     field_create_instance($instance);
 
     // Check that no initial cache entry is present.
@@ -310,7 +310,7 @@ function testFieldAttachCache() {
     $entity_init = entity_create($entity_type, array(
       'ftid' => 1,
       'ftvid' => 2,
-      'fttype' => $this->instance['bundle'],
+      'fttype' => $this->instance->bundle,
     ));
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity = clone($entity_init);
@@ -340,7 +340,7 @@ function testFieldAttachValidate() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
     // Set up all but one values of the first field to generate errors.
@@ -432,16 +432,16 @@ function testFieldAttachForm() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
     // When generating form for all fields.
     $form = array();
     $form_state = form_state_defaults();
-    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance['bundle'], 'default');
+    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance->bundle, 'default');
     field_attach_form($entity, $form, $form_state);
 
-    $this->assertEqual($form[$this->field_name][$langcode]['#title'], $this->instance['label'], "First field's form title is {$this->instance['label']}");
+    $this->assertEqual($form[$this->field_name][$langcode]['#title'], $this->instance->label, "First field's form title is {$this->instance->label}");
     $this->assertEqual($form[$this->field_name_2][$langcode]['#title'], $this->instance_2['label'], "Second field's form title is {$this->instance_2['label']}");
     for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
       // field_test_widget uses 'textfield'
@@ -456,7 +456,7 @@ function testFieldAttachForm() {
     $options = array('field_name' => $this->field_name_2);
     $form = array();
     $form_state = form_state_defaults();
-    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance['bundle'], 'default');
+    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance->bundle, 'default');
     field_attach_form($entity, $form, $form_state, NULL, $options);
 
     $this->assertFalse(isset($form[$this->field_name]), 'The first field does not exist in the form');
@@ -474,13 +474,13 @@ function testFieldAttachExtractFormValues() {
     $this->createFieldWithInstance('_2');
 
     $entity_type = 'test_entity';
-    $entity_init = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity_init = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
     // Build the form for all fields.
     $form = array();
     $form_state = form_state_defaults();
-    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance['bundle'], 'default');
+    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance->bundle, 'default');
     field_attach_form($entity_init, $form, $form_state);
 
     // Simulate incoming values.
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
index 7192067..9d560a9 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php
@@ -38,7 +38,7 @@ public function setUp() {
   function testFieldAttachSaveLoad() {
     // Configure the instance so that we test hook_field_load() (see
     // field_test_field_load() in field_test.module).
-    $this->instance['settings']['test_hook_field_load'] = TRUE;
+    $this->instance->settings['test_hook_field_load'] = TRUE;
     field_update_instance($this->instance);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
@@ -49,7 +49,7 @@ function testFieldAttachSaveLoad() {
 
     // Preparation: create three revisions and store them in $revision array.
     for ($revision_id = 0; $revision_id < 3; $revision_id++) {
-      $revision[$revision_id] = field_test_create_entity(0, $revision_id, $this->instance['bundle']);
+      $revision[$revision_id] = field_test_create_entity(0, $revision_id, $this->instance->bundle);
       // Note: we try to insert one extra value.
       $values[$revision_id] = $this->_generateTestFieldValues($this->field['cardinality'] + 1);
       $current_revision = $revision_id;
@@ -66,7 +66,7 @@ function testFieldAttachSaveLoad() {
     }
 
     // Confirm current revision loads the correct data.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     field_attach_load($entity_type, array(0 => $entity));
     // Number of values per field loaded equals the field cardinality.
     $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], 'Current revision: expected number of values');
@@ -79,7 +79,7 @@ function testFieldAttachSaveLoad() {
 
     // Confirm each revision loads the correct data.
     foreach (array_keys($revision) as $revision_id) {
-      $entity = field_test_create_entity(0, $revision_id, $this->instance['bundle']);
+      $entity = field_test_create_entity(0, $revision_id, $this->instance->bundle);
       field_attach_load_revision($entity_type, array(0 => $entity));
       // Number of values per field loaded equals the field cardinality.
       $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], format_string('Revision %revision_id: expected number of values.', array('%revision_id' => $revision_id)));
@@ -240,8 +240,8 @@ function testFieldStorageDetailsAlter() {
     );
     field_create_instance($instance);
 
-    $field = field_info_field($instance['field_name']);
-    $instance = field_info_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+    $field = field_info_field($instance->getFieldId());
+    $instance = field_info_instance($instance->entity_type, $instance->getFieldId(), $instance->bundle);
 
     // The storage details are indexed by a storage engine type.
     $this->assertTrue(array_key_exists('drupal_variables', $field['storage_details']), 'The storage type is Drupal variables.');
@@ -344,7 +344,7 @@ function testFieldAttachSaveMissingData() {
    */
   function testFieldAttachSaveMissingDataDefaultValue() {
     // Add a default value function.
-    $this->instance['default_value_function'] = 'field_test_default_value';
+    $this->instance->default_value_function = 'field_test_default_value';
     field_update_instance($this->instance);
 
     // Verify that fields are populated with default values.
@@ -386,7 +386,7 @@ function testFieldAttachSaveMissingDataDefaultValue() {
   function testFieldAttachDelete() {
     $entity_type = 'test_entity';
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
-    $rev[0] = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $rev[0] = field_test_create_entity(0, 0, $this->instance->bundle);
 
     // Create revision 0
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
@@ -394,18 +394,18 @@ function testFieldAttachDelete() {
     field_attach_insert($rev[0]);
 
     // Create revision 1
-    $rev[1] = field_test_create_entity(0, 1, $this->instance['bundle']);
+    $rev[1] = field_test_create_entity(0, 1, $this->instance->bundle);
     $rev[1]->{$this->field_name}[$langcode] = $values;
     field_attach_update($rev[1]);
 
     // Create revision 2
-    $rev[2] = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $rev[2] = field_test_create_entity(0, 2, $this->instance->bundle);
     $rev[2]->{$this->field_name}[$langcode] = $values;
     field_attach_update($rev[2]);
 
     // Confirm each revision loads
     foreach (array_keys($rev) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance->bundle);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
     }
@@ -413,24 +413,24 @@ function testFieldAttachDelete() {
     // Delete revision 1, confirm the other two still load.
     field_attach_delete_revision($rev[1]);
     foreach (array(0, 2) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance->bundle);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
     }
 
     // Confirm the current revision still loads
-    $read = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $read = field_test_create_entity(0, 2, $this->instance->bundle);
     field_attach_load($entity_type, array(0 => $read));
     $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity current revision has {$this->field['cardinality']} values.");
 
     // Delete all field data, confirm nothing loads
     field_attach_delete($rev[2]);
     foreach (array(0, 1, 2) as $vid) {
-      $read = field_test_create_entity(0, $vid, $this->instance['bundle']);
+      $read = field_test_create_entity(0, $vid, $this->instance->bundle);
       field_attach_load_revision($entity_type, array(0 => $read));
       $this->assertIdentical($read->{$this->field_name}, array(), "The test entity revision $vid is deleted.");
     }
-    $read = field_test_create_entity(0, 2, $this->instance['bundle']);
+    $read = field_test_create_entity(0, 2, $this->instance->bundle);
     field_attach_load($entity_type, array(0 => $read));
     $this->assertIdentical($read->{$this->field_name}, array(), 'The test entity current revision is deleted.');
   }
@@ -444,11 +444,11 @@ function testEntityCreateRenameBundle() {
     field_test_create_bundle($new_bundle);
 
     // Add an instance to that bundle.
-    $this->instance['bundle'] = $new_bundle;
+    $this->instance->bundle = $new_bundle;
     field_create_instance($this->instance);
 
     // Save an entity with data in the field.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity->{$this->field_name}[$langcode] = $values;
@@ -456,17 +456,17 @@ function testEntityCreateRenameBundle() {
     field_attach_insert($entity);
 
     // Verify the field data is present on load.
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     field_attach_load($entity_type, array(0 => $entity));
     $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Data is retrieved for the new bundle");
 
     // Rename the bundle.
     $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
-    field_test_rename_bundle($this->instance['bundle'], $new_bundle);
+    field_test_rename_bundle($this->instance->bundle, $new_bundle);
 
     // Check that the instance definition has been updated.
     $this->instance = field_info_instance($entity_type, $this->field_name, $new_bundle);
-    $this->assertIdentical($this->instance['bundle'], $new_bundle, "Bundle name has been updated in the instance.");
+    $this->assertIdentical($this->instance->bundle, $new_bundle, "Bundle name has been updated in the instance.");
 
     // Verify the field data is present on load.
     $entity = field_test_create_entity(0, 0, $new_bundle);
@@ -483,7 +483,7 @@ function testEntityDeleteBundle() {
     field_test_create_bundle($new_bundle);
 
     // Add an instance to that bundle.
-    $this->instance['bundle'] = $new_bundle;
+    $this->instance->bundle = $new_bundle;
     field_create_instance($this->instance);
 
     // Create a second field for the test bundle
@@ -493,7 +493,7 @@ function testEntityDeleteBundle() {
     $instance = array(
       'field_name' => $field_name,
       'entity_type' => 'test_entity',
-      'bundle' => $this->instance['bundle'],
+      'bundle' => $this->instance->bundle,
       'label' => $this->randomName() . '_label',
       'description' => $this->randomName() . '_description',
       'weight' => mt_rand(0, 127),
@@ -501,7 +501,7 @@ function testEntityDeleteBundle() {
     field_create_instance($instance);
 
     // Save an entity with data for both fields
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $values = $this->_generateTestFieldValues($this->field['cardinality']);
     $entity->{$this->field_name}[$langcode] = $values;
@@ -509,22 +509,22 @@ function testEntityDeleteBundle() {
     field_attach_insert($entity);
 
     // Verify the fields are present on load
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     field_attach_load('test_entity', array(0 => $entity));
     $this->assertEqual(count($entity->{$this->field_name}[$langcode]), 4, 'First field got loaded');
     $this->assertEqual(count($entity->{$field_name}[$langcode]), 1, 'Second field got loaded');
 
     // Delete the bundle.
-    field_test_delete_bundle($this->instance['bundle']);
+    field_test_delete_bundle($this->instance->bundle);
 
     // Verify no data gets loaded
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     field_attach_load('test_entity', array(0 => $entity));
     $this->assertFalse(isset($entity->{$this->field_name}[$langcode]), 'No data for first field');
     $this->assertFalse(isset($entity->{$field_name}[$langcode]), 'No data for second field');
 
     // Verify that the instances are gone
-    $this->assertFalse(field_read_instance('test_entity', $this->field_name, $this->instance['bundle']), "First field is deleted");
-    $this->assertFalse(field_read_instance('test_entity', $field_name, $instance['bundle']), "Second field is deleted");
+    $this->assertFalse(field_read_instance('test_entity', $this->field_name, $this->instance->bundle), "First field is deleted");
+    $this->assertFalse(field_read_instance('test_entity', $field_name, $instance->bundle), "Second field is deleted");
   }
 }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldImportChangeTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldImportChangeTest.php
index 70e7286..d5fdcde 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldImportChangeTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldImportChangeTest.php
@@ -46,7 +46,7 @@ function testImportChange() {
     $manifest = $active->read($manifest_name);
     $instance = $active->read($instance_config_name);
     $new_label = 'Test update import field';
-    $instance['label'] = $new_label;
+    $instance->label = $new_label;
 
     // Save as files in the the staging directory.
     $staging = $this->container->get('config.storage.staging');
@@ -58,7 +58,7 @@ function testImportChange() {
 
     // Check that the updated config was correctly imported.
     $instance = entity_load('field_instance', $instance_id);
-    $this->assertEqual($instance['label'], $new_label, 'Instance label updated');
+    $this->assertEqual($instance->label, $new_label, 'Instance label updated');
   }
 
 }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
index dad0e54..e844530 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php
@@ -83,18 +83,18 @@ function testFieldInfo() {
     field_create_instance($instance);
 
     $info = entity_get_info('test_entity');
-    $instances = field_info_instances('test_entity', $instance['bundle']);
+    $instances = field_info_instances('test_entity', $instance->bundle);
     $this->assertEqual(count($instances), 1, format_string('One instance shows up in info when attached to a bundle on a @label.', array(
       '@label' => $info['label']
     )));
-    $this->assertTrue($instance < $instances[$instance['field_name']], 'Instance appears in info correctly');
+    $this->assertTrue($instance < $instances[$instance->getFieldId()], 'Instance appears in info correctly');
 
     // Test a valid entity type but an invalid bundle.
     $instances = field_info_instances('test_entity', 'invalid_bundle');
     $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'invalid_bundle') returns an empty array.");
 
     // Test invalid entity type and bundle.
-    $instances = field_info_instances('invalid_entity', $instance['bundle']);
+    $instances = field_info_instances('invalid_entity', $instance->bundle);
     $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity', 'test_bundle') returns an empty array.");
 
     // Test invalid entity type, no bundle provided.
@@ -176,7 +176,7 @@ function testInstancePrepare() {
 
     // Check that all expected instance settings are in place.
     $field_type = field_info_field_types($field_definition['type']);
-    $this->assertEqual($instance['settings'], $field_type['instance_settings'] , 'All expected instance settings are present.');
+    $this->assertEqual($instance->settings, $field_type['instance_settings'] , 'All expected instance settings are present.');
   }
 
   /**
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
index 5f9578a..2793859 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php
@@ -95,8 +95,8 @@ function testCreateFieldInstance() {
     // by the field.
     try {
       $instance = $this->instance_definition;
-      $instance['field_name'] = $field_restricted['field_name'];
-      $instance['entity_type'] = 'test_cacheable_entity';
+      $instance->id = $field_restricted['field_name'];
+      $instance->entity_type = 'test_cacheable_entity';
       field_create_instance($instance);
       $this->pass(t('Can create an instance on an entity type allowed by the field.'));
     }
@@ -108,7 +108,7 @@ function testCreateFieldInstance() {
     // forbidden by the field.
     try {
       $instance = $this->instance_definition;
-      $instance['field_name'] = $field_restricted['field_name'];
+      $instance->id = $field_restricted['field_name'];
       field_create_instance($instance);
       $this->fail(t('Cannot create an instance on an entity type forbidden by the field.'));
     }
@@ -127,9 +127,9 @@ function testReadFieldInstance() {
 
     // Read the instance back.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
-    $this->assertTrue($this->instance_definition['field_name'] == $instance['field_name'], 'The field was properly read.');
-    $this->assertTrue($this->instance_definition['entity_type'] == $instance['entity_type'], 'The field was properly read.');
-    $this->assertTrue($this->instance_definition['bundle'] == $instance['bundle'], 'The field was properly read.');
+    $this->assertTrue($this->instance_definition['field_name'] == $instance->getFieldId(), 'The field was properly read.');
+    $this->assertTrue($this->instance_definition['entity_type'] == $instance->entity_type, 'The field was properly read.');
+    $this->assertTrue($this->instance_definition['bundle'] == $instance->bundle, 'The field was properly read.');
   }
 
   /**
@@ -140,16 +140,16 @@ function testUpdateFieldInstance() {
 
     // Check that basic changes are saved.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
-    $instance['required'] = !$instance['required'];
-    $instance['label'] = $this->randomName();
-    $instance['description'] = $this->randomName();
-    $instance['settings']['test_instance_setting'] = $this->randomName();
+    $instance->required = !$instance->required;
+    $instance->label = $this->randomName();
+    $instance->description = $this->randomName();
+    $instance->settings['test_instance_setting'] = $this->randomName();
     field_update_instance($instance);
 
     $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
-    $this->assertEqual($instance['required'], $instance_new['required'], '"required" change is saved');
-    $this->assertEqual($instance['label'], $instance_new['label'], '"label" change is saved');
-    $this->assertEqual($instance['description'], $instance_new['description'], '"description" change is saved');
+    $this->assertEqual($instance->required, $instance_new['required'], '"required" change is saved');
+    $this->assertEqual($instance->label, $instance_new['label'], '"label" change is saved');
+    $this->assertEqual($instance->description, $instance_new['description'], '"description" change is saved');
 
     // TODO: test failures.
   }
@@ -171,13 +171,13 @@ function testDeleteFieldInstance() {
 
     // Test that the first instance is not deleted, and then delete it.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
-    $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new field instance is not marked for deletion.');
+    $this->assertTrue(!empty($instance) && empty($instance->deleted), 'A new field instance is not marked for deletion.');
     field_delete_instance($instance);
 
     // Make sure the instance is marked as deleted when the instance is
     // specifically loaded.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
-    $this->assertTrue(!empty($instance['deleted']), 'A deleted field instance is marked for deletion.');
+    $this->assertTrue(!empty($instance->deleted), 'A deleted field instance is marked for deletion.');
 
     // Try to load the instance normally and make sure it does not show up.
     $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
@@ -185,13 +185,13 @@ function testDeleteFieldInstance() {
 
     // Make sure the other field instance is not deleted.
     $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
-    $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'A non-deleted field instance is not marked for deletion.');
+    $this->assertTrue(!empty($another_instance) && empty($another_instance->deleted), 'A non-deleted field instance is not marked for deletion.');
 
     // Make sure the field is deleted when its last instance is deleted.
     field_delete_instance($another_instance);
     $deleted_fields = \Drupal::state()->get('field.field.deleted');
-    $this->assertTrue(isset($deleted_fields[$another_instance['field_id']]), 'A deleted field is marked for deletion.');
-    $field = field_read_field($another_instance['field_name']);
+    $this->assertTrue(isset($deleted_fields[$another_instance->field_uuid]), 'A deleted field is marked for deletion.');
+    $field = field_read_field($another_instance->getFieldId());
     $this->assertFalse($field, 'The field marked to be deleted is not found anymore in the configuration.');
   }
 }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FormTest.php b/core/modules/field/lib/Drupal/field/Tests/FormTest.php
index e2fbac6..897c88d 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FormTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FormTest.php
@@ -51,10 +51,10 @@ function setUp() {
   function testFieldFormSingle() {
     $this->field = $this->field_single;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -75,7 +75,7 @@ function testFieldFormSingle() {
     // Submit with invalid value (field-level validation).
     $edit = array("{$this->field_name}[$langcode][0][value]" => -1);
     $this->drupalPost(NULL, $edit, t('Save'));
-    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $this->instance['label'])), 'Field validation fails with invalid input.');
+    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $this->instance->label)), 'Field validation fails with invalid input.');
     // TODO : check that the correct field is flagged for error.
 
     // Create an entity
@@ -118,12 +118,12 @@ function testFieldFormSingle() {
   function testFieldFormDefaultValue() {
     $this->field = $this->field_single;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     $default = rand(1, 127);
-    $this->instance['default_value'] = array(array('value' => $default));
+    $this->instance->default_value = array(array('value' => $default));
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -146,11 +146,11 @@ function testFieldFormDefaultValue() {
   function testFieldFormSingleRequired() {
     $this->field = $this->field_single;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
-    $this->instance['required'] = TRUE;
+    $this->instance->id = $this->field_name;
+    $this->instance->required = TRUE;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -158,7 +158,7 @@ function testFieldFormSingleRequired() {
     // Submit with missing required value.
     $edit = array();
     $this->drupalPost('test-entity/add/test_bundle', $edit, t('Save'));
-    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance->label)), 'Required field with no value fails validation');
 
     // Create an entity
     $value = mt_rand(1, 127);
@@ -174,13 +174,13 @@ function testFieldFormSingleRequired() {
     $value = '';
     $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
     $this->drupalPost('test-entity/manage/' . $id . '/edit', $edit, t('Save'));
-    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance->label)), 'Required field with no value fails validation');
   }
 
 //  function testFieldFormMultiple() {
 //    $this->field = $this->field_multiple;
 //    $this->field_name = $this->field['field_name'];
-//    $this->instance['field_name'] = $this->field_name;
+//    $this->instance->id = $this->field_name;
 //    field_create_field($this->field);
 //    field_create_instance($this->instance);
 //  }
@@ -188,10 +188,10 @@ function testFieldFormSingleRequired() {
   function testFieldFormUnlimited() {
     $this->field = $this->field_unlimited;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -271,10 +271,10 @@ function testFieldFormMultivalueWithRequiredRadio() {
     // Create a multivalue test field.
     $this->field = $this->field_unlimited;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -294,8 +294,8 @@ function testFieldFormMultivalueWithRequiredRadio() {
       'required' => TRUE,
     );
     field_create_instance($instance);
-    entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')
-      ->setComponent($instance['field_name'], array(
+    entity_get_form_display($instance->entity_type, $instance->bundle, 'default')
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'options_buttons',
       ))
       ->save();
@@ -318,10 +318,10 @@ function testFieldFormMultivalueWithRequiredRadio() {
   function testFieldFormJSAddMore() {
     $this->field = $this->field_unlimited;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name)
       ->save();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
@@ -380,10 +380,10 @@ function testFieldFormMultipleWidget() {
     // widget.
     $this->field = $this->field_multiple;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
+    $this->instance->id = $this->field_name;
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($this->field_name, array(
         'type' => 'test_field_widget_multiple',
       ))
@@ -424,10 +424,10 @@ function testFieldFormAccess() {
     $field = $this->field_single;
     $field_name = $field['field_name'];
     $instance = $this->instance;
-    $instance['field_name'] = $field_name;
+    $instance->id = $field_name;
     field_create_field($field);
     field_create_instance($instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
       ->setComponent($field_name)
       ->save();
 
@@ -454,11 +454,11 @@ function testFieldFormAccess() {
     // Test that the form structure includes full information for each delta
     // apart from #access.
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
 
     $form = array();
     $form_state = form_state_defaults();
-    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance['bundle'], 'default');
+    $form_state['form_display'] = entity_get_form_display($entity_type, $this->instance->bundle, 'default');
     field_attach_form($entity, $form, $form_state);
 
     $this->assertEqual($form[$field_name_no_access][$langcode][0]['value']['#entity_type'], $entity_type, 'The correct entity type is set in the field structure.');
@@ -502,17 +502,17 @@ function testNestedFieldForm() {
     // Add two instances on the 'test_bundle'
     field_create_field($this->field_single);
     field_create_field($this->field_unlimited);
-    $this->instance['field_name'] = 'field_single';
-    $this->instance['label'] = 'Single field';
+    $this->instance->id = 'field_single';
+    $this->instance->label = 'Single field';
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'])
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId())
       ->save();
-    $this->instance['field_name'] = 'field_unlimited';
-    $this->instance['label'] = 'Unlimited field';
+    $this->instance->id = 'field_unlimited';
+    $this->instance->label = 'Unlimited field';
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'])
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId())
       ->save();
 
     // Create two entities.
@@ -616,12 +616,12 @@ function testNestedFieldForm() {
   function testFieldFormHiddenWidget() {
     $this->field = $this->field_single;
     $this->field_name = $this->field['field_name'];
-    $this->instance['field_name'] = $this->field_name;
-    $this->instance['default_value'] = array(0 => array('value' => 99));
+    $this->instance->id = $this->field_name;
+    $this->instance->default_value = array(0 => array('value' => 99));
     field_create_field($this->field);
     field_create_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'], array(
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId(), array(
         'type' => 'hidden',
       ))
       ->save();
@@ -642,10 +642,10 @@ function testFieldFormHiddenWidget() {
 
     // Update the instance to remove the default value and switch to the
     // default widget.
-    $this->instance['default_value'] = NULL;
+    $this->instance->default_value = NULL;
     field_update_instance($this->instance);
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'], array(
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId(), array(
         'type' => 'test_field_widget',
       ))
       ->save();
@@ -664,8 +664,8 @@ function testFieldFormHiddenWidget() {
     $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was updated');
 
     // Update the form display and switch to the Hidden widget again.
-    entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default')
-      ->setComponent($this->instance['field_name'], array(
+    entity_get_form_display($this->instance->entity_type, $this->instance->bundle, 'default')
+      ->setComponent($this->instance->getFieldId(), array(
         'type' => 'hidden',
       ))
       ->save();
diff --git a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
index ae52f2e..5b0c103 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php
@@ -108,7 +108,7 @@ function testFieldInvoke() {
     field_test_entity_info_translatable('test_entity', TRUE);
 
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
 
     // Populate some extra languages to check if _field_invoke() correctly uses
     // the result of field_available_languages().
@@ -153,7 +153,7 @@ function testFieldInvokeMultiple() {
     $available_langcodes = field_available_languages($this->entity_type, $this->field);
 
     for ($id = 1; $id <= $entity_count; ++$id) {
-      $entity = field_test_create_entity($id, $id, $this->instance['bundle']);
+      $entity = field_test_create_entity($id, $id, $this->instance->bundle);
       $langcodes = $available_langcodes;
 
       // Populate some extra languages to check whether _field_invoke()
@@ -224,7 +224,7 @@ function testTranslatableFieldSaveLoad() {
     field_test_entity_info_translatable('test_entity', TRUE);
     $eid = $evid = 1;
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $evid, $this->instance->bundle);
     $field_translations = array();
     $available_langcodes = field_available_languages($entity_type, $this->field);
     $this->assertTrue(count($available_langcodes) > 1, 'Field is translatable.');
@@ -264,7 +264,7 @@ function testTranslatableFieldSaveLoad() {
 
     $eid++;
     $evid++;
-    $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['bundle'], 'langcode' => $translation_langcodes[0]);
+    $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance->bundle, 'langcode' => $translation_langcodes[0]);
     foreach ($translation_langcodes as $langcode) {
       $values[$this->field_name][$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
     }
@@ -275,14 +275,14 @@ function testTranslatableFieldSaveLoad() {
     $this->assertEqual($translation_langcodes, $field_langcodes, 'Missing translations did not get a default value.');
 
     foreach ($entity->{$field_name_default} as $langcode => $items) {
-      $this->assertEqual($items, $instance['default_value'], format_string('Default value correctly populated for language %language.', array('%language' => $langcode)));
+      $this->assertEqual($items, $instance->default_value, format_string('Default value correctly populated for language %language.', array('%language' => $langcode)));
     }
 
     // Check that explicit empty values are not overridden with default values.
     foreach (array(NULL, array()) as $empty_items) {
       $eid++;
       $evid++;
-      $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance['bundle'], 'langcode' => $translation_langcodes[0]);
+      $values = array('eid' => $eid, 'evid' => $evid, 'fttype' => $instance->bundle, 'langcode' => $translation_langcodes[0]);
       foreach ($translation_langcodes as $langcode) {
         $values[$this->field_name][$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
         $values[$field_name_default][$langcode] = $empty_items;
@@ -319,8 +319,8 @@ function testFieldDisplayLanguage() {
     );
     field_create_instance($instance);
 
-    $entity = field_test_create_entity(1, 1, $this->instance['bundle']);
-    $instances = field_info_instances($entity_type, $this->instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $this->instance->bundle);
+    $instances = field_info_instances($entity_type, $this->instance->bundle);
 
     $enabled_langcodes = field_content_languages();
     $langcodes = array();
@@ -331,7 +331,7 @@ function testFieldDisplayLanguage() {
     // Generate field translations for languages different from the first
     // enabled.
     foreach ($instances as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $field = field_info_field($field_name);
       do {
         // Index 0 is reserved for the requested language, this way we ensure
@@ -358,7 +358,7 @@ function testFieldDisplayLanguage() {
     $requested_langcode = $enabled_langcodes[0];
     $display_langcodes = field_language($entity, NULL, $requested_langcode);
     foreach ($instances as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $this->assertTrue($display_langcodes[$field_name] == $locked_languages[$field_name], format_string('The display language for field %field_name is %language.', array('%field_name' => $field_name, '%language' => $locked_languages[$field_name])));
     }
 
@@ -367,7 +367,7 @@ function testFieldDisplayLanguage() {
     drupal_static_reset('field_language');
     $display_langcodes = field_language($entity, NULL, $requested_langcode);
     foreach ($instances as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $langcode = $display_langcodes[$field_name];
       // As the requested language was not assinged to any field, if the
       // returned language is defined for the current field, core fallback rules
diff --git a/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php
index 786f1b4..85fb19b 100644
--- a/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php
@@ -76,7 +76,7 @@ function testFieldFormTranslationRevisions() {
     // Prepare the field translations.
     field_test_entity_info_translatable($this->entity_type, TRUE);
     $eid = 1;
-    $entity = field_test_create_entity($eid, $eid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $eid, $this->instance->bundle);
     $available_langcodes = array_flip(field_available_languages($this->entity_type, $this->field));
     unset($available_langcodes[Language::LANGCODE_NOT_SPECIFIED]);
     $field_name = $this->field['field_name'];
diff --git a/core/modules/field/tests/modules/field_test/field_test.field.inc b/core/modules/field/tests/modules/field_test/field_test.field.inc
index d2f4a94..a54bf41 100644
--- a/core/modules/field/tests/modules/field_test/field_test.field.inc
+++ b/core/modules/field/tests/modules/field_test/field_test.field.inc
@@ -128,7 +128,7 @@ function field_test_field_validate(EntityInterface $entity = NULL, $field, $inst
     if ($item['value'] == -1) {
       $errors[$field['field_name']][$langcode][$delta][] = array(
         'error' => 'field_test_invalid',
-        'message' => t('%name does not accept the value -1.', array('%name' => $instance['label'])),
+        'message' => t('%name does not accept the value -1.', array('%name' => $instance->label)),
       );
     }
   }
@@ -162,7 +162,7 @@ function field_test_field_settings_form($field, $instance, $has_data) {
  * Implements hook_field_instance_settings_form().
  */
 function field_test_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['test_instance_setting'] = array(
     '#type' => 'textfield',
diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module
index c2070f2..0e3aa47 100644
--- a/core/modules/field/tests/modules/field_test/field_test.module
+++ b/core/modules/field/tests/modules/field_test/field_test.module
@@ -204,7 +204,7 @@ function field_test_field_attach_view_alter(&$output, $context) {
  */
 function field_test_field_widget_form_alter(&$element, &$form_state, $context) {
   $instance = $context['instance'];
-  $entity_form_display = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default');
+  $entity_form_display = entity_get_form_display($instance->entity_type, $instance->bundle, 'default');
   switch ($context['field']['field_name']) {
     case 'alter_test_text':
       drupal_set_message('Field size: ' . $entity_form_display->getWidget($context['field']['field_name'])->getSetting('size'));
diff --git a/core/modules/field/tests/modules/field_test/field_test.storage.inc b/core/modules/field/tests/modules/field_test/field_test.storage.inc
index d3a7f82..b0d7760 100644
--- a/core/modules/field/tests/modules/field_test/field_test.storage.inc
+++ b/core/modules/field/tests/modules/field_test/field_test.storage.inc
@@ -193,8 +193,8 @@ function field_test_field_storage_delete(EntityInterface $entity, $fields) {
   // Note: reusing field_test_storage_purge(), like field_sql_storage.module
   // does, is highly inefficient in our case...
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    if (isset($fields[$instance['field_id']])) {
-      $field = field_info_field_by_id($instance['field_id']);
+    if (isset($fields[$instance->field_uuid])) {
+      $field = field_info_field_by_id($instance->field_uuid);
       field_test_field_storage_purge($entity, $field, $instance);
     }
   }
@@ -402,11 +402,11 @@ function field_test_field_storage_delete_field($field) {
 function field_test_field_storage_delete_instance($instance) {
   $data = _field_test_storage_data();
 
-  $field = field_info_field($instance['field_name']);
+  $field = field_info_field($instance->getFieldId());
   $field_data = &$data[$field['uuid']];
   foreach (array('current', 'revisions') as $sub_table) {
     foreach ($field_data[$sub_table] as &$row) {
-      if ($row->bundle == $instance['bundle']) {
+      if ($row->bundle == $instance->bundle) {
         $row->deleted = TRUE;
       }
     }
@@ -424,7 +424,7 @@ function field_test_entity_bundle_rename($entity_type, $bundle_old, $bundle_new)
   // We need to account for deleted or inactive fields and instances.
   $instances = field_read_instances(array('bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
   foreach ($instances as $field_name => $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     if ($field && $field['storage']['type'] == 'field_test_storage') {
       $field_data = &$data[$field['uuid']];
       foreach (array('current', 'revisions') as $sub_table) {
@@ -446,12 +446,12 @@ function field_test_entity_bundle_rename($entity_type, $bundle_old, $bundle_new)
 function field_test_field_delete_instance($instance) {
   $data = _field_test_storage_data();
 
-  $field = field_info_field($instance['field_name']);
+  $field = field_info_field($instance->getFieldId());
   if ($field['storage']['type'] == 'field_test_storage') {
     $field_data = &$data[$field['uuid']];
     foreach (array('current', 'revisions') as $sub_table) {
       foreach ($field_data[$sub_table] as &$row) {
-        if ($row->bundle == $instance['bundle']) {
+        if ($row->bundle == $instance->bundle) {
           $row->deleted = TRUE;
         }
       }
diff --git a/core/modules/field_sql_storage/field_sql_storage.module b/core/modules/field_sql_storage/field_sql_storage.module
index dcbe476..d482155 100644
--- a/core/modules/field_sql_storage/field_sql_storage.module
+++ b/core/modules/field_sql_storage/field_sql_storage.module
@@ -528,8 +528,8 @@ function field_sql_storage_field_storage_write(EntityInterface $entity, $op, $fi
  */
 function field_sql_storage_field_storage_delete(EntityInterface $entity, $fields) {
   foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-    if (isset($fields[$instance['field_id']])) {
-      $field = field_info_field_by_id($instance['field_id']);
+    if (isset($fields[$instance->field_uuid])) {
+      $field = field_info_field_by_id($instance->field_uuid);
       field_sql_storage_field_storage_purge($entity, $field, $instance);
     }
   }
@@ -580,18 +580,18 @@ function field_sql_storage_field_storage_delete_revision(EntityInterface $entity
  * This function simply marks for deletion all data associated with the field.
  */
 function field_sql_storage_field_storage_delete_instance($instance) {
-  $field = field_info_field($instance['field_name']);
+  $field = field_info_field($instance->getFieldId());
   $table_name = _field_sql_storage_tablename($field);
   $revision_name = _field_sql_storage_revision_tablename($field);
   db_update($table_name)
     ->fields(array('deleted' => 1))
-    ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('entity_type', $instance->entity_type)
+    ->condition('bundle', $instance->bundle)
     ->execute();
   db_update($revision_name)
     ->fields(array('deleted' => 1))
-    ->condition('entity_type', $instance['entity_type'])
-    ->condition('bundle', $instance['bundle'])
+    ->condition('entity_type', $instance->entity_type)
+    ->condition('bundle', $instance->bundle)
     ->execute();
 }
 
@@ -602,7 +602,7 @@ function field_sql_storage_entity_bundle_rename($entity_type, $bundle_old, $bund
   // We need to account for deleted or inactive fields and instances.
   $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
   foreach ($instances as $instance) {
-    $field = field_info_field_by_id($instance['field_id']);
+    $field = field_info_field_by_id($instance->field_uuid);
     if ($field['storage']['type'] == 'field_sql_storage') {
       $table_name = _field_sql_storage_tablename($field);
       $revision_name = _field_sql_storage_revision_tablename($field);
diff --git a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
index 3598446..3232ad0 100644
--- a/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
+++ b/core/modules/field_sql_storage/lib/Drupal/field_sql_storage/Tests/FieldSqlStorageTest.php
@@ -86,7 +86,7 @@ function testFieldAttachLoad() {
     $query->execute();
 
     // Load the "most current revision"
-    $entity = field_test_create_entity($eid, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, 0, $this->instance->bundle);
     field_attach_load($entity_type, array($eid => $entity));
     foreach ($values[0] as $delta => $value) {
       if ($delta < $this->field['cardinality']) {
@@ -99,7 +99,7 @@ function testFieldAttachLoad() {
 
     // Load every revision
     for ($evid = 0; $evid < 4; ++$evid) {
-      $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+      $entity = field_test_create_entity($eid, $evid, $this->instance->bundle);
       field_attach_load_revision($entity_type, array($eid => $entity));
       foreach ($values[$evid] as $delta => $value) {
         if ($delta < $this->field['cardinality']) {
@@ -115,7 +115,7 @@ function testFieldAttachLoad() {
     // loaded.
     $eid = $evid = 1;
     $unavailable_langcode = 'xx';
-    $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
+    $entity = field_test_create_entity($eid, $evid, $this->instance->bundle);
     $values = array($entity_type, $eid, $evid, 0, $unavailable_langcode, mt_rand(1, 127));
     db_insert($this->table)->fields($columns)->values($values)->execute();
     db_insert($this->revision_table)->fields($columns)->values($values)->execute();
@@ -129,7 +129,7 @@ function testFieldAttachLoad() {
    */
   function testFieldAttachInsertAndUpdate() {
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
     // Test insert.
@@ -153,7 +153,7 @@ function testFieldAttachInsertAndUpdate() {
     }
 
     // Test update.
-    $entity = field_test_create_entity(0, 1, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 1, $this->instance->bundle);
     $values = array();
     // Note: we try to update one extra value ('<=' instead of '<').
     for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
@@ -210,7 +210,7 @@ function testFieldAttachInsertAndUpdate() {
    */
   function testFieldAttachSaveMissingData() {
     $entity_type = 'test_entity';
-    $entity = field_test_create_entity(0, 0, $this->instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $this->instance->bundle);
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
 
     // Insert: Field is missing
@@ -261,7 +261,7 @@ function testFieldAttachSaveMissingData() {
     $unavailable_langcode = 'xx';
     db_insert($this->table)
       ->fields(array('entity_type', 'bundle', 'deleted', 'entity_id', 'revision_id', 'delta', 'langcode'))
-      ->values(array($entity_type, $this->instance['bundle'], 0, 0, 0, 0, $unavailable_langcode))
+      ->values(array($entity_type, $this->instance->bundle, 0, 0, 0, 0, $unavailable_langcode))
       ->execute();
     $count = db_select($this->table)
       ->countQuery()
@@ -309,7 +309,7 @@ function testUpdateFieldSchemaWithData() {
     $field = field_create_field($field);
     $instance = array('field_name' => 'decimal52', 'entity_type' => 'test_entity', 'bundle' => 'test_bundle');
     $instance = field_create_instance($instance);
-    $entity = field_test_create_entity(0, 0, $instance['bundle']);
+    $entity = field_test_create_entity(0, 0, $instance->bundle);
     $entity->decimal52[Language::LANGCODE_NOT_SPECIFIED][0]['value'] = '1.235';
     $entity->save();
 
@@ -369,7 +369,7 @@ function testFieldUpdateIndexesWithData() {
     }
 
     // Add data so the table cannot be dropped.
-    $entity = field_test_create_entity(1, 1, $instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $instance->bundle);
     $entity->{$field_name}[Language::LANGCODE_NOT_SPECIFIED][0]['value'] = 'field data';
     $entity->save();
 
@@ -389,7 +389,7 @@ function testFieldUpdateIndexesWithData() {
     }
 
     // Verify that the tables were not dropped.
-    $entity = field_test_create_entity(1, 1, $instance['bundle']);
+    $entity = field_test_create_entity(1, 1, $instance->bundle);
     field_attach_load('test_entity', array(1 => $entity));
     $this->assertEqual($entity->{$field_name}[Language::LANGCODE_NOT_SPECIFIED][0]['value'], 'field data', t("Index changes performed without dropping the tables"));
   }
@@ -403,7 +403,7 @@ function testFieldStorageDetails() {
 
     // Retrieve the field and instance with field_info so the storage details are attached.
     $field = field_info_field($this->field['field_name']);
-    $instance = field_info_instance($this->instance['entity_type'], $this->instance['field_name'], $this->instance['bundle']);
+    $instance = field_info_instance($this->instance->entity_type, $this->instance->getFieldId(), $this->instance->bundle);
 
     // The storage details are indexed by a storage engine type.
     $this->assertTrue(array_key_exists('sql', $field['storage_details']), 'The storage type is SQL.');
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index 3ee1eaa..670c8d0 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -66,10 +66,10 @@ function field_ui_inactive_message($entity_type, $bundle) {
     $field_types = field_info_field_types();
 
     foreach ($inactive_instances as $field_name => $instance) {
-      $field = field_info_field($instance['field_name']);
+      $field = field_info_field($instance->getFieldId());
       $list[] = t('%field (@field_name) field requires the %field_type field type provided by %field_type_module module', array(
-      '%field' => $instance['label'],
-      '@field_name' => $instance['field_name'],
+      '%field' => $instance->label,
+      '@field_name' => $instance->getFieldId(),
       '%field_type' => isset($field_types[$field['type']]) ? $field_types[$field['type']]['label'] : $field['type'],
       '%field_type_module' => $field['module'],
       ));
@@ -406,7 +406,7 @@ function field_ui_existing_field_options($entity_type, $bundle) {
       // No need to look in the current bundle.
       if (!($existing_bundle == $bundle && $existing_entity_type == $entity_type)) {
         foreach ($instances as $instance) {
-          $field = field_info_field($instance['field_name']);
+          $field = field_info_field($instance->getFieldId());
           // Don't show
           // - locked fields,
           // - fields already in the current bundle,
@@ -417,12 +417,12 @@ function field_ui_existing_field_options($entity_type, $bundle) {
             && !field_info_instance($entity_type, $field['field_name'], $bundle)
             && (empty($field['entity_types']) || in_array($entity_type, $field['entity_types']))
             && empty($field_types[$field['type']]['no_ui'])) {
-            $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']);
-            $info[$instance['field_name']] = array(
+            $widget = entity_get_form_display($instance->entity_type, $instance->bundle, 'default')->getComponent($instance->getFieldId());
+            $info[$instance->getFieldId()] = array(
               'type' => $field['type'],
               'type_label' => $field_types[$field['type']]['label'],
               'field' => $field['field_name'],
-              'label' => $instance['label'],
+              'label' => $instance->label,
               'widget_type' => $widget['type'],
             );
           }
diff --git a/core/modules/field_ui/field_ui.api.php b/core/modules/field_ui/field_ui.api.php
index 81a5f3b..0660cd2 100644
--- a/core/modules/field_ui/field_ui.api.php
+++ b/core/modules/field_ui/field_ui.api.php
@@ -65,7 +65,7 @@ function hook_field_settings_form($field, $instance, $has_data) {
  *   The form definition for the field instance settings.
  */
 function hook_field_instance_settings_form($field, $instance, $form_state) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['text_processing'] = array(
     '#type' => 'radios',
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 51115b8..a1839cd 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -284,8 +284,8 @@ function field_ui_inactive_instances($entity_type, $bundle_name = NULL) {
   // $active list collected earlier.
   $all_instances = field_read_instances($params, array('include_inactive' => TRUE));
   foreach ($all_instances as $instance) {
-    if (!isset($active[$instance['bundle']][$instance['field_name']])) {
-      $inactive[$instance['bundle']][$instance['field_name']] = $instance;
+    if (!isset($active[$instance->bundle][$instance->getFieldId()])) {
+      $inactive[$instance->bundle][$instance->getFieldId()] = $instance;
     }
   }
 
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
index e6caf4e..2c731ff 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -113,11 +113,11 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
           'defaultFormatter' => $field_types[$field['type']]['default_formatter'],
         ),
         'human_name' => array(
-          '#markup' => check_plain($instance['label']),
+          '#markup' => check_plain($instance->label),
         ),
         'weight' => array(
           '#type' => 'textfield',
-          '#title' => t('Weight for @title', array('@title' => $instance['label'])),
+          '#title' => t('Weight for @title', array('@title' => $instance->label)),
           '#title_display' => 'invisible',
           '#default_value' => $display_options ? $display_options['weight'] : '0',
           '#size' => 3,
@@ -126,7 +126,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
         'parent_wrapper' => array(
           'parent' => array(
             '#type' => 'select',
-            '#title' => t('Label display for @title', array('@title' => $instance['label'])),
+            '#title' => t('Label display for @title', array('@title' => $instance->label)),
             '#title_display' => 'invisible',
             '#options' => $table['#parent_options'],
             '#empty_value' => '',
@@ -141,7 +141,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
         ),
         'label' => array(
           '#type' => 'select',
-          '#title' => t('Label display for @title', array('@title' => $instance['label'])),
+          '#title' => t('Label display for @title', array('@title' => $instance->label)),
           '#title_display' => 'invisible',
           '#options' => $field_label_options,
           '#default_value' => $display_options ? $display_options['label'] : 'above',
@@ -153,7 +153,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
       $table[$name]['format'] = array(
         'type' => array(
           '#type' => 'select',
-          '#title' => t('Formatter for @title', array('@title' => $instance['label'])),
+          '#title' => t('Formatter for @title', array('@title' => $instance->label)),
           '#title_display' => 'invisible',
           '#options' => $formatter_options,
           '#default_value' => $display_options ? $display_options['type'] : 'hidden',
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
index 44e4be7..1b351e3 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php
@@ -87,19 +87,19 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
 
     // Fields.
     foreach ($instances as $name => $instance) {
-      $field = field_info_field($instance['field_name']);
-      $widget_configuration = $entity_form_display->getComponent($instance['field_name']);
+      $field = field_info_field($instance->getFieldId());
+      $widget_configuration = $entity_form_display->getComponent($instance->getFieldId());
       $admin_field_path = $this->adminPath . '/fields/' . $instance->id();
       $table[$name] = array(
         '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
         '#row_type' => 'field',
         '#region_callback' => 'field_ui_field_overview_row_region',
         'label' => array(
-          '#markup' => check_plain($instance['label']),
+          '#markup' => check_plain($instance->label),
         ),
         'weight' => array(
           '#type' => 'textfield',
-          '#title' => t('Weight for @title', array('@title' => $instance['label'])),
+          '#title' => t('Weight for @title', array('@title' => $instance->label)),
           '#title_display' => 'invisible',
           '#default_value' => $widget_configuration ? $widget_configuration['weight'] : '0',
           '#size' => 3,
@@ -108,7 +108,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
         'parent_wrapper' => array(
           'parent' => array(
             '#type' => 'select',
-            '#title' => t('Parent for @title', array('@title' => $instance['label'])),
+            '#title' => t('Parent for @title', array('@title' => $instance->label)),
             '#title_display' => 'invisible',
             '#options' => $table['#parent_options'],
             '#empty_value' => '',
@@ -122,7 +122,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
           ),
         ),
         'field_name' => array(
-          '#markup' => $instance['field_name'],
+          '#markup' => $instance->getFieldId(),
         ),
         'type' => array(
           '#type' => 'link',
@@ -592,7 +592,7 @@ public function submitForm(array &$form, array &$form_state) {
         $form_state['fields_added']['_add_new_field'] = $field['field_name'];
       }
       catch (\Exception $e) {
-        drupal_set_message(t('There was a problem creating field %label: !message', array('%label' => $instance['label'], '!message' => $e->getMessage())), 'error');
+        drupal_set_message(t('There was a problem creating field %label: !message', array('%label' => $instance->label, '!message' => $e->getMessage())), 'error');
       }
     }
 
@@ -633,10 +633,10 @@ public function submitForm(array &$form, array &$form_state) {
 
           $destinations[] = $this->adminPath . '/fields/' . $new_instance->id();
           // Store new field information for any additional submit handlers.
-          $form_state['fields_added']['_add_existing_field'] = $instance['field_name'];
+          $form_state['fields_added']['_add_existing_field'] = $instance->getFieldId();
         }
         catch (\Exception $e) {
-          drupal_set_message(t('There was a problem creating field instance %label: @message.', array('%label' => $instance['label'], '@message' => $e->getMessage())), 'error');
+          drupal_set_message(t('There was a problem creating field instance %label: @message.', array('%label' => $instance->label, '@message' => $e->getMessage())), 'error');
         }
       }
     }
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php
index b37ddc3..5554ff2 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php
@@ -65,8 +65,8 @@ public function getFormID() {
   public function buildForm(array $form, array &$form_state, FieldInstance $field_instance = NULL) {
     $this->instance = $form_state['instance'] = $field_instance;
 
-    $bundle = $this->instance['bundle'];
-    $entity_type = $this->instance['entity_type'];
+    $bundle = $this->instance->bundle;
+    $entity_type = $this->instance->entity_type;
     $field = $this->instance->getField();
     $entity_form_display = entity_get_form_display($entity_type, $bundle, 'default');
     $bundles = entity_get_bundles();
@@ -79,7 +79,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
     $form['#field'] = $field;
     $form['#entity_form_display'] = $entity_form_display;
     // Create an arbitrary entity object (used by the 'default value' widget).
-    $ids = (object) array('entity_type' => $this->instance['entity_type'], 'bundle' => $this->instance['bundle'], 'entity_id' => NULL);
+    $ids = (object) array('entity_type' => $this->instance->entity_type, 'bundle' => $this->instance->bundle, 'entity_id' => NULL);
     $form['#entity'] = _field_create_entity_from_ids($ids);
     $form['#entity']->field_ui_default_value = TRUE;
 
@@ -98,7 +98,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
     // Build the non-configurable instance values.
     $form['instance']['field_name'] = array(
       '#type' => 'value',
-      '#value' => $this->instance['field_name'],
+      '#value' => $this->instance->getFieldId(),
     );
     $form['instance']['entity_type'] = array(
       '#type' => 'value',
@@ -121,7 +121,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
     $form['instance']['description'] = array(
       '#type' => 'textarea',
       '#title' => t('Help text'),
-      '#default_value' => !empty($this->instance['description']) ? $this->instance['description'] : '',
+      '#default_value' => !empty($this->instance->description) ? $this->instance->description : '',
       '#rows' => 5,
       '#description' => t('Instructions to present to the user below this field on the editing form.<br />Allowed HTML tags: @tags', array('@tags' => _field_filter_xss_display_allowed_tags())) . '<br />' . t('This field supports tokens.'),
       '#weight' => -10,
@@ -130,7 +130,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
     $form['instance']['required'] = array(
       '#type' => 'checkbox',
       '#title' => t('Required field'),
-      '#default_value' => !empty($this->instance['required']),
+      '#default_value' => !empty($this->instance->required),
       '#weight' => -5,
     );
 
@@ -142,12 +142,12 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
     }
 
     // Add widget settings for the widget type.
-    $additions = $entity_form_display->getWidget($this->instance->getField()->id)->settingsForm($form, $form_state);
+    $additions = $entity_form_display->getWidget($this->instance->getFieldId())->settingsForm($form, $form_state);
     $form['instance']['widget']['settings'] = $additions ?: array('#type' => 'value', '#value' => array());
     $form['instance']['widget']['#weight'] = 20;
 
     // Add handling for default value if not provided by any other module.
-    if (field_behaviors_widget('default_value', $this->instance) == FIELD_BEHAVIOR_DEFAULT && empty($this->instance['default_value_function'])) {
+    if (field_behaviors_widget('default_value', $this->instance) == FIELD_BEHAVIOR_DEFAULT && empty($this->instance->default_value_function)) {
       $form['instance']['default_value_widget'] = $this->getDefaultValueWidget($field, $form, $form_state);
     }
 
@@ -170,7 +170,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_
   public function validateForm(array &$form, array &$form_state) {
     // Take the incoming values as the $this->instance definition, so that the 'default
     // value' gets validated using the instance settings being submitted.
-    $field_name = $this->instance['field_name'];
+    $field_name = $this->instance->getFieldId();
     $entity = $form['#entity'];
     $entity_form_display = $form['#entity_form_display'];
 
@@ -179,7 +179,7 @@ public function validateForm(array &$form, array &$form_state) {
 
       // Extract the 'default value'.
       $items = array();
-      $entity_form_display->getWidget($this->instance->getField()->id)->extractFormValues($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
+      $entity_form_display->getWidget($this->instance->getFieldId())->extractFormValues($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
 
       // Grab the field definition from $form_state.
       $field_state = field_form_get_state($element['#parents'], $field_name, Language::LANGCODE_NOT_SPECIFIED, $form_state);
@@ -199,7 +199,7 @@ public function validateForm(array &$form, array &$form_state) {
         field_form_set_state($element['#parents'], $field_name, Language::LANGCODE_NOT_SPECIFIED, $form_state, $field_state);
 
         // Assign reported errors to the correct form element.
-        $entity_form_display->getWidget($this->instance->getField()->id)->flagErrors($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
+        $entity_form_display->getWidget($this->instance->getFieldId())->flagErrors($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
       }
     }
   }
@@ -218,15 +218,15 @@ public function submitForm(array &$form, array &$form_state) {
 
       // Extract field values.
       $items = array();
-      $entity_form_display->getWidget($this->instance->getField()->id)->extractFormValues($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
+      $entity_form_display->getWidget($this->instance->getFieldId())->extractFormValues($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
 
-      $this->instance['default_value'] = $items ? $items : NULL;
+      $this->instance->default_value = $items ? $items : NULL;
     }
 
     // Handle widget settings.
-    $options = $entity_form_display->getComponent($this->instance->getField()->id);
+    $options = $entity_form_display->getComponent($this->instance->getFieldId());
     $options['settings'] = $form_state['values']['instance']['widget']['settings'];
-    $entity_form_display->setComponent($this->instance->getField()->id, $options)->save();
+    $entity_form_display->setComponent($this->instance->getFieldId(), $options)->save();
     unset($form_state['values']['instance']['widget']);
 
     // Merge incoming values into the instance.
@@ -237,11 +237,11 @@ public function submitForm(array &$form, array &$form_state) {
 
     drupal_set_message(t('Saved %label configuration.', array('%label' => $this->instance->label())));
 
-    if ($this->instance['required'] && empty($this->instance['default_value']) && empty($this->instance['default_value_function']) && $this->instance['widget']['type'] == 'field_hidden') {
-      drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $this->instance['label'])), 'warning');
+    if ($this->instance->required && empty($this->instance->default_value) && empty($this->instance->default_value_function) && $this->instance['widget']['type'] == 'field_hidden') {
+      drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $this->instance->label)), 'warning');
     }
 
-    $form_state['redirect'] = field_ui_next_destination($this->instance['entity_type'], $this->instance['bundle']);
+    $form_state['redirect'] = field_ui_next_destination($this->instance->entity_type, $this->instance->bundle);
   }
 
   /**
@@ -253,7 +253,7 @@ public function delete(array &$form, array &$form_state) {
       $destination = drupal_get_destination();
       unset($_GET['destination']);
     }
-    $form_state['redirect'] = array('admin/structure/types/manage/' . $this->instance['bundle'] . '/fields/' . $this->instance->id() . '/delete', array('query' => $destination));
+    $form_state['redirect'] = array('admin/structure/types/manage/' . $this->instance->bundle . '/fields/' . $this->instance->id() . '/delete', array('query' => $destination));
   }
 
   /**
@@ -276,12 +276,12 @@ protected function getDefaultValueWidget($field, array &$form, &$form_state) {
 
     // Adjust the instance definition used for the form element. We want a
     // non-required input and no description.
-    $this->instance['required'] = FALSE;
-    $this->instance['description'] = '';
+    $this->instance->required = FALSE;
+    $this->instance->description = '';
 
     // Adjust the instance definition to use the default widget of this field type
     // instead of the hidden widget.
-    if ($this->instance['widget']['type'] == 'field_hidden') {
+    /*if ($this->instance['widget']['type'] == 'field_hidden') {
       $field_type = field_info_field_types($field['type']);
       $default_widget = $this->widgetManager->getDefinition($field_type['default_widget']);
 
@@ -290,15 +290,15 @@ protected function getDefaultValueWidget($field, array &$form, &$form_state) {
         'settings' => $default_widget['settings'],
         'weight' => 0,
       );
-    }
+    }*/
 
     // Insert the widget. Since we do not use the "official" instance definition,
     // the whole flow cannot use field_invoke_method().
     $items = array();
-    if (!empty($this->instance['default_value'])) {
-      $items = (array) $this->instance['default_value'];
+    if (!empty($this->instance->default_value)) {
+      $items = (array) $this->instance->default_value;
     }
-    $element += $entity_form_display->getWidget($this->instance->getField()->id)->form($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
+    $element += $entity_form_display->getWidget($this->instance->getFieldId())->form($entity, Language::LANGCODE_NOT_SPECIFIED, $items, $element, $form_state);
 
     return $element;
   }
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php
index 5558bc6..14e219f 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php
@@ -64,11 +64,11 @@ public function getFormID() {
   public function buildForm(array $form, array &$form_state, FieldInstance $field_instance = NULL) {
     $this->instance = $form_state['instance'] = $field_instance;
     form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin');
-    drupal_set_title($this->instance['label']);
+    drupal_set_title($this->instance->label);
 
-    $bundle = $this->instance['bundle'];
-    $entity_type = $this->instance['entity_type'];
-    $field_name = $this->instance['field_name'];
+    $bundle = $this->instance->bundle;
+    $entity_type = $this->instance->entity_type;
+    $field_name = $this->instance->getFieldId();
 
     $entity_form_display = entity_get_form_display($entity_type, $bundle, 'default');
     $field = $this->instance->getField();
@@ -120,14 +120,15 @@ public function submitForm(array &$form, array &$form_state) {
 
     try {
       $entity_form_display->save();
-      drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance['label'])));
+      drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance->label)));
 
-      if ($instance['required'] && empty($instance['default_value']) && empty($instance['default_value_function']) && $instance['widget']['type'] == 'field_hidden') {
-        drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $instance['label'])), 'warning');
+//      if ($instance->required && empty($instance->default_value) && empty($instance->default_value_function) && $instance['widget']['type'] == 'hidden') {
+      if ($instance->required && empty($instance->default_value) && empty($instance->default_value_function)) {
+      drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $instance->label)), 'warning');
       }
     }
     catch (Exception $e) {
-      drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance['label'])), 'error');
+      drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance->label)), 'error');
     }
 
     $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle);
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
index 51dc8b1..9939353 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageDisplayTest.php
@@ -178,10 +178,6 @@ function testNonInitializedFields() {
     );
     $this->fieldUIAddNewField('admin/structure/types/manage/' . $this->type, $edit);
 
-    // Check that no settings have been set for the 'teaser' mode.
-    $instance = field_info_instance('node', 'field_test', $this->type);
-    $this->assertFalse(isset($instance['display']['teaser']));
-
     // Check that the field appears as 'hidden' on the 'Manage display' page
     // for the 'teaser' mode.
     $this->drupalGet('admin/structure/types/manage/' . $this->type . '/display/teaser');
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
index 3b49b57..572a7b2 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php
@@ -237,7 +237,7 @@ function assertFieldSettings($bundle, $field_name, $string = 'dummy test string'
 
     // Assert instance and widget settings.
     $instance = field_info_instance($entity_type, $field_name, $bundle);
-    $this->assertTrue($instance['settings']['test_instance_setting'] == $string, 'Field instance settings were found.');
+    $this->assertTrue($instance->settings['test_instance_setting'] == $string, 'Field instance settings were found.');
 
     // Assert widget settings.
     $widget_configuration = entity_get_form_display($entity_type, $bundle, 'default')->getComponent($field_name);
@@ -284,7 +284,7 @@ function testDefaultValue() {
     $this->assertText("Saved $field_name configuration", 'The form was successfully submitted.');
     field_info_cache_clear();
     $instance = field_info_instance('node', $field_name, $this->type);
-    $this->assertEqual($instance['default_value'], array(array('value' => 1)), 'The default value was correctly saved.');
+    $this->assertEqual($instance->default_value, array(array('value' => 1)), 'The default value was correctly saved.');
 
     // Check that the default value shows up in the form
     $this->drupalGet($admin_path);
@@ -296,10 +296,10 @@ function testDefaultValue() {
     $this->assertText("Saved $field_name configuration", 'The form was successfully submitted.');
     field_info_cache_clear();
     $instance = field_info_instance('node', $field_name, $this->type);
-    $this->assertEqual($instance['default_value'], NULL, 'The default value was correctly saved.');
+    $this->assertEqual($instance->default_value, NULL, 'The default value was correctly saved.');
 
     // Change the widget to TestFieldWidgetNoDefault.
-    entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')
+    entity_get_form_display($instance->entity_type, $instance->bundle, 'default')
       ->setComponent($field_name, array(
         'type' => 'test_field_widget_no_default',
       ))
@@ -417,7 +417,7 @@ function testHiddenFields() {
     // Check that the newly added instance appears on the 'Manage Fields'
     // screen.
     $this->drupalGet($bundle_path);
-    $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $instance['label'], 'Field was created and appears in the overview page.');
+    $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $instance->label, 'Field was created and appears in the overview page.');
 
     // Check that the instance does not appear in the 're-use existing field' row
     // on other bundles.
diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index 4e7253e..8d494eb 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -81,7 +81,7 @@ function file_field_settings_form($field, $instance, $has_data) {
  * Implements hook_field_instance_settings_form().
  */
 function file_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['file_directory'] = array(
     '#type' => 'textfield',
@@ -327,8 +327,8 @@ function file_field_displayed($item, $field) {
 function file_field_widget_upload_validators($field, $instance) {
   // Cap the upload size according to the PHP limit.
   $max_filesize = parse_size(file_upload_max_size());
-  if (!empty($instance['settings']['max_filesize']) && parse_size($instance['settings']['max_filesize']) < $max_filesize) {
-    $max_filesize = parse_size($instance['settings']['max_filesize']);
+  if (!empty($instance->settings['max_filesize']) && parse_size($instance->settings['max_filesize']) < $max_filesize) {
+    $max_filesize = parse_size($instance->settings['max_filesize']);
   }
 
   $validators = array();
@@ -337,8 +337,8 @@ function file_field_widget_upload_validators($field, $instance) {
   $validators['file_validate_size'] = array($max_filesize);
 
   // Add the extension check if necessary.
-  if (!empty($instance['settings']['file_extensions'])) {
-    $validators['file_validate_extensions'] = array($instance['settings']['file_extensions']);
+  if (!empty($instance->settings['file_extensions'])) {
+    $validators['file_validate_extensions'] = array($instance->settings['file_extensions']);
   }
 
   return $validators;
@@ -361,7 +361,7 @@ function file_field_widget_upload_validators($field, $instance) {
  * @see \Drupal\Core\Utility\Token::replace()
  */
 function file_field_widget_uri($field, $instance, $data = array()) {
-  $destination = trim($instance['settings']['file_directory'], '/');
+  $destination = trim($instance->settings['file_directory'], '/');
 
   // Replace tokens.
   $destination = Drupal::token()->replace($destination, $data);
@@ -471,7 +471,7 @@ function file_field_widget_process($element, &$form_state, $form) {
   }
 
   // Add the description field if enabled.
-  if (!empty($instance['settings']['description_field']) && $item['fids']) {
+  if (!empty($instance->settings['description_field']) && $item['fids']) {
     $config = config('file.settings');
     $element['description'] = array(
       '#type' => $config->get('description.type'),
diff --git a/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php b/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php
index 4eebf6c..f7e8104 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php
@@ -85,8 +85,8 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
     $id_prefix = implode('-', array_merge($parents, array($field_name)));
     $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
 
-    $title = check_plain($instance['label']);
-    $description = field_filter_xss($instance['description']);
+    $title = check_plain($instance->label);
+    $description = field_filter_xss($instance->description);
 
     $elements = array();
 
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
index a26e464..bc0cd36 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
@@ -104,7 +104,7 @@ function attachFileField($name, $entity_type, $bundle, $instance_settings = arra
       'required' => !empty($instance_settings['required']),
       'settings' => array(),
     );
-    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance->settings = array_merge($instance->settings, $instance_settings);
     field_create_instance($instance);
 
     entity_get_form_display($entity_type, $bundle, 'default')
@@ -120,12 +120,12 @@ function attachFileField($name, $entity_type, $bundle, $instance_settings = arra
    */
   function updateFileField($name, $type_name, $instance_settings = array(), $widget_settings = array()) {
     $instance = field_info_instance('node', $name, $type_name);
-    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance->settings = array_merge($instance->settings, $instance_settings);
 
     field_update_instance($instance);
 
-    entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')
-      ->setComponent($instance['field_name'], array(
+    entity_get_form_display($instance->entity_type, $instance->bundle, 'default')
+      ->setComponent($instance->getFieldId(), array(
         'settings' => $widget_settings,
       ))
       ->save();
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
index 403ef45..01e87a0 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
@@ -39,7 +39,7 @@ function testRequired() {
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $edit = array("title" => $this->randomName());
     $this->drupalPost('node/add/' . $type_name, $edit, t('Save and publish'));
-    $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), t('Node save failed when required file field was empty.'));
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance->label)), t('Node save failed when required file field was empty.'));
 
     // Create a new node with the uploaded file.
     $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
@@ -58,7 +58,7 @@ function testRequired() {
     // Try to post a new node without uploading a file in the multivalue field.
     $edit = array('title' => $this->randomName());
     $this->drupalPost('node/add/' . $type_name, $edit, t('Save and publish'));
-    $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), t('Node save failed when required multiple value file field was empty.'));
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance->label)), t('Node save failed when required multiple value file field was empty.'));
 
     // Create a new node with the uploaded file into the multivalue field.
     $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc
index eed43df..0e53277 100644
--- a/core/modules/image/image.field.inc
+++ b/core/modules/image/image.field.inc
@@ -90,7 +90,7 @@ function image_field_settings_form($field, $instance) {
  * Implements hook_field_instance_settings_form().
  */
 function image_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   // Use the file field instance settings form as a basis.
   $form = file_field_instance_settings_form($field, $instance);
@@ -362,7 +362,7 @@ function image_field_widget_process($element, &$form_state, $form) {
 
   // Get field settings.
   $instance = field_widget_instance($element, $form_state);
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   // Add the additional alt and title fields.
   $element['alt'] = array(
diff --git a/core/modules/image/image.module b/core/modules/image/image.module
index 2304c7d..1fd51e5 100644
--- a/core/modules/image/image.module
+++ b/core/modules/image/image.module
@@ -402,21 +402,21 @@ function image_field_update_field($field, $prior_field, $has_data) {
  */
 function image_field_delete_instance($instance) {
   // Only act on image fields.
-  $field = field_read_field($instance['field_name']);
+  $field = field_read_field($instance->getFieldId());
   if ($field['type'] != 'image') {
     return;
   }
 
   // The value of a managed_file element can be an array if the #extended
   // property is set to TRUE.
-  $fid = $instance['settings']['default_image'];
+  $fid = $instance->settings['default_image'];
   if (is_array($fid)) {
     $fid = $fid['fid'];
   }
 
   // Remove the default image when the instance is deleted.
   if ($fid && ($file = file_load($fid))) {
-    file_usage()->delete($file, 'image', 'default_image', $instance['id']);
+    file_usage()->delete($file, 'image', 'default_image', $instance->id);
   }
 }
 
@@ -425,18 +425,18 @@ function image_field_delete_instance($instance) {
  */
 function image_field_update_instance($instance, $prior_instance) {
   // Only act on image fields.
-  $field = field_read_field($instance['field_name']);
+  $field = field_read_field($instance->getFieldId());
   if ($field['type'] != 'image') {
     return;
   }
 
   // The value of a managed_file element can be an array if the #extended
   // property is set to TRUE.
-  $fid_new = $instance['settings']['default_image'];
+  $fid_new = $instance->settings['default_image'];
   if (isset($fid_new['fids'])) {
     $fid_new = $fid_new['fids'];
   }
-  $fid_old = $prior_instance['settings']['default_image'];
+  $fid_old = $prior_instance->settings['default_image'];
   if (isset($fid_old['fids'])) {
     $fid_old = $fid_old['fids'];
   }
@@ -448,11 +448,11 @@ function image_field_update_instance($instance, $prior_instance) {
     if ($file_new) {
       $file_new->status = FILE_STATUS_PERMANENT;
       $file_new->save();
-      file_usage()->add($file_new, 'image', 'default_image', $instance['uuid']);
+      file_usage()->add($file_new, 'image', 'default_image', $instance->uuid);
     }
     // Delete the old file, if present.
     if ($fid_old && ($file_old = file_load($fid_old[0]))) {
-      file_usage()->delete($file_old, 'image', 'default_image', $instance['uuid']);
+      file_usage()->delete($file_old, 'image', 'default_image', $instance->uuid);
     }
   }
 
diff --git a/core/modules/image/lib/Drupal/image/ImageStyleStorageController.php b/core/modules/image/lib/Drupal/image/ImageStyleStorageController.php
index 97766b5..63ab22e 100644
--- a/core/modules/image/lib/Drupal/image/ImageStyleStorageController.php
+++ b/core/modules/image/lib/Drupal/image/ImageStyleStorageController.php
@@ -76,27 +76,27 @@ protected function replaceImageStyle(ImageStyle $style) {
       $instances = field_read_instances();
       // Loop through all fields searching for image fields.
       foreach ($instances as $instance) {
-        if ($instance->getField()->type == 'image') {
-          $view_modes = entity_get_view_modes($instance['entity_type']);
+        if ($instance->getFieldType() == 'image') {
+          $view_modes = entity_get_view_modes($instance->entity_type);
           $view_modes = array('default') + array_keys($view_modes);
           foreach ($view_modes as $view_mode) {
-            $display = entity_get_display($instance['entity_type'], $instance['bundle'], $view_mode);
-            $display_options = $display->getComponent($instance['field_name']);
+            $display = entity_get_display($instance->entity_type, $instance->bundle, $view_mode);
+            $display_options = $display->getComponent($instance->getFieldId());
 
             // Check if the formatter involves an image style.
             if ($display_options && $display_options['type'] == 'image' && $display_options['settings']['image_style'] == $style->getOriginalID()) {
               // Update display information for any instance using the image
               // style that was just deleted.
               $display_options['settings']['image_style'] = $style->id();
-              $display->setComponent($instance['field_name'], $display_options)
+              $display->setComponent($instance->getFieldId(), $display_options)
                 ->save();
             }
           }
-          $entity_form_display = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default');
-          $widget_configuration = $entity_form_display->getComponent($instance['field_name']);
+          $entity_form_display = entity_get_form_display($instance->entity_type, $instance->bundle, 'default');
+          $widget_configuration = $entity_form_display->getComponent($instance->getFieldId());
           if ($widget_configuration['settings']['preview_image_style'] == $style->getOriginalID()) {
             $widget_options['settings']['preview_image_style'] = $style->id();
-            $entity_form_display->setComponent($instance['field_name'], $widget_options)
+            $entity_form_display->setComponent($instance->getFieldId(), $widget_options)
               ->save();
           }
         }
diff --git a/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php b/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php
index 8062ff6..0364861 100644
--- a/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php
+++ b/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php
@@ -62,7 +62,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
     if ($this->field['cardinality'] == 1) {
       // If there's only one field, return it as delta 0.
       if (empty($elements[0]['#default_value']['fids'])) {
-        $elements[0]['#description'] = theme('file_upload_help', array('description' => $this->instance['description'], 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field['cardinality']));
+        $elements[0]['#description'] = theme('file_upload_help', array('description' => $this->instance->description, 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field['cardinality']));
       }
     }
     else {
@@ -78,7 +78,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $
   public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
     $element = parent::formElement($items, $delta, $element, $langcode, $form, $form_state);
 
-    $settings = $this->instance['settings'];
+    $settings = $this->instance->settings;
 
     // Add upload resolution validation.
     if ($settings['max_resolution'] || $settings['min_resolution']) {
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
index 78a957f..e121fc2 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php
@@ -60,8 +60,8 @@ function testDefaultImages() {
       'field_name' => $field['field_name'],
       'entity_type' => 'node',
       'bundle' => 'page',
-      'label' => $instance['label'],
-      'required' => $instance['required'],
+      'label' => $instance->label,
+      'required' => $instance->required,
       'settings' => array(
         'default_image' => $default_images['instance2']->fid,
       ),
@@ -69,7 +69,7 @@ function testDefaultImages() {
     field_create_instance($instance2);
     $instance2 = field_info_instance('node', $field_name, 'page');
 
-    $widget_settings = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($field['field_name']);
+    $widget_settings = entity_get_form_display($instance->entity_type, $instance->bundle, 'default')->getComponent($field['field_name']);
     entity_get_form_display('node', 'page', 'default')
       ->setComponent($field['field_name'], $widget_settings)
       ->save();
@@ -179,7 +179,7 @@ function testDefaultImages() {
     );
 
     // Upload a new default for the article's field instance.
-    $instance['settings']['default_image'] = $default_images['instance_new']->fid;
+    $instance->settings['default_image'] = $default_images['instance_new']->fid;
     field_update_instance($instance);
 
     // Confirm the new field instance default is used on the article field
@@ -218,7 +218,7 @@ function testDefaultImages() {
     );
 
     // Remove the instance default from articles.
-    $instance['settings']['default_image'] = 0;
+    $instance->settings['default_image'] = 0;
     field_update_instance($instance);
 
     // Confirm the article field instance default has been removed.
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
index 3aaf93e..b86ec32 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
@@ -196,7 +196,7 @@ function testImageFieldSettings() {
       $field_name . '[' . Language::LANGCODE_NOT_SPECIFIED . '][0][title]' => $this->randomName($test_size),
     );
     $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save and keep published'));
-    $schema = $instance->getField()->getSchema();
+    $schema = $instance->getFieldSchema();
     $this->assertRaw(t('Alternate text cannot be longer than %max characters but is currently %length characters long.', array(
       '%max' => $schema['columns']['alt']['length'],
       '%length' => $test_size,
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
index b670741..b88240f 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
@@ -87,7 +87,7 @@ function createImageField($name, $type_name, $field_settings = array(), $instanc
       'description' => !empty($instance_settings['description']) ? $instance_settings['description'] : '',
       'settings' => array(),
     );
-    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance->settings = array_merge($instance->settings, $instance_settings);
     $field_instance = field_create_instance($instance);
 
     entity_get_form_display('node', $type_name, 'default')
diff --git a/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php b/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php
index 0784cae..b60b7eb 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php
@@ -49,13 +49,13 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#placeholder' => $this->getSetting('placeholder_title'),
       '#default_value' => isset($items[$delta]['title']) ? $items[$delta]['title'] : NULL,
       '#maxlength' => 255,
-      '#access' => $instance['settings']['title'] != DRUPAL_DISABLED,
+      '#access' => $instance->settings['title'] != DRUPAL_DISABLED,
     );
     // Post-process the title field to make it conditionally required if URL is
     // non-empty. Omit the validation on the field edit form, since the field
     // settings cannot be saved otherwise.
     $is_field_edit_form = ($element['#entity'] === NULL);
-    if (!$is_field_edit_form && $instance['settings']['title'] == DRUPAL_REQUIRED) {
+    if (!$is_field_edit_form && $instance->settings['title'] == DRUPAL_REQUIRED) {
       $element['#element_validate'] = array(array($this, 'validateTitle'));
     }
 
diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
index 5748970..e1505f2 100644
--- a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
+++ b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php
@@ -151,7 +151,7 @@ function testLinkTitle() {
     // Verify that the link text field works according to the field setting.
     foreach (array(DRUPAL_DISABLED, DRUPAL_REQUIRED, DRUPAL_OPTIONAL) as $title_setting) {
       // Update the link title field setting.
-      $this->instance['settings']['title'] = $title_setting;
+      $this->instance->settings['title'] = $title_setting;
       field_update_instance($this->instance);
 
       // Display creation form.
diff --git a/core/modules/link/link.module b/core/modules/link/link.module
index 16091f1..36afee2 100644
--- a/core/modules/link/link.module
+++ b/core/modules/link/link.module
@@ -44,7 +44,7 @@ function link_field_instance_settings_form($field, $instance) {
   $form['title'] = array(
     '#type' => 'radios',
     '#title' => t('Allow link text'),
-    '#default_value' => isset($instance['settings']['title']) ? $instance['settings']['title'] : DRUPAL_OPTIONAL,
+    '#default_value' => isset($instance->settings['title']) ? $instance->settings['title'] : DRUPAL_OPTIONAL,
     '#options' => array(
       DRUPAL_DISABLED => t('Disabled'),
       DRUPAL_OPTIONAL => t('Optional'),
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
index 0c9ed3e..e364a21 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php
@@ -278,11 +278,11 @@ protected function buildFilters(&$form, &$form_state) {
     $tag_fields = array();
     foreach ($bundles as $bundle) {
       foreach (field_info_instances($this->entity_type, $bundle) as $instance) {
-        $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']);
+        $widget = entity_get_form_display($instance->entity_type, $instance->bundle, 'default')->getComponent($instance->getFieldId());
         // We define "tag-like" taxonomy fields as ones that use the
         // "Autocomplete term widget (tagging)" widget.
         if ($widget['type'] == 'taxonomy_autocomplete') {
-          $tag_fields[] = $instance['field_name'];
+          $tag_fields[] = $instance->getFieldId();
         }
       }
     }
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTokenReplaceTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTokenReplaceTest.php
index 90b7493..4d6c50b 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTokenReplaceTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTokenReplaceTest.php
@@ -54,8 +54,8 @@ function testNodeTokenReplacement() {
     $tests['[node:type]'] = 'article';
     $tests['[node:type-name]'] = 'Article';
     $tests['[node:title]'] = check_plain($node->title);
-    $tests['[node:body]'] = text_sanitize($instance['settings']['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'value');
-    $tests['[node:summary]'] = text_sanitize($instance['settings']['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'summary');
+    $tests['[node:body]'] = text_sanitize($instance->settings['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'value');
+    $tests['[node:summary]'] = text_sanitize($instance->settings['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'summary');
     $tests['[node:langcode]'] = check_plain($node->langcode);
     $tests['[node:url]'] = url('node/' . $node->nid, $url_options);
     $tests['[node:edit-url]'] = url('node/' . $node->nid . '/edit', $url_options);
@@ -96,7 +96,7 @@ function testNodeTokenReplacement() {
 
     // Generate and test sanitized token - use full body as expected value.
     $tests = array();
-    $tests['[node:summary]'] = text_sanitize($instance['settings']['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'value');
+    $tests['[node:summary]'] = text_sanitize($instance->settings['text_processing'], $node->langcode, $node->body[$node->langcode][0], 'value');
 
     // Test to make sure that we generated something for each token.
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated for node without a summary.');
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypeTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypeTest.php
index 6a5b5f6..5789545 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypeTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTypeTest.php
@@ -84,7 +84,7 @@ function testNodeTypeEditing() {
     $this->drupalLogin($web_user);
 
     $instance = field_info_instance('node', 'body', 'page');
-    $this->assertEqual($instance['label'], 'Body', 'Body field was found.');
+    $this->assertEqual($instance->label, 'Body', 'Body field was found.');
 
     // Verify that title and body fields are displayed.
     $this->drupalGet('node/add/page');
diff --git a/core/modules/node/node.tokens.inc b/core/modules/node/node.tokens.inc
index 241b83b..48f33f1 100644
--- a/core/modules/node/node.tokens.inc
+++ b/core/modules/node/node.tokens.inc
@@ -143,11 +143,11 @@ function node_tokens($type, $tokens, array $data = array(), array $options = arr
 
             // If the summary was requested and is not empty, use it.
             if ($name == 'summary' && !empty($items[0]['summary'])) {
-              $output = $sanitize ? text_sanitize($instance['settings']['text_processing'], $field_langcode, $items[0], 'summary') : $items[0]['summary'];
+              $output = $sanitize ? text_sanitize($instance->settings['text_processing'], $field_langcode, $items[0], 'summary') : $items[0]['summary'];
             }
             // Attempt to provide a suitable version of the 'body' field.
             else {
-              $output = $sanitize ? text_sanitize($instance['settings']['text_processing'], $field_langcode, $items[0], 'value') : $items[0]['value'];
+              $output = $sanitize ? text_sanitize($instance->settings['text_processing'], $field_langcode, $items[0], 'value') : $items[0]['value'];
               // A summary was requested.
               if ($name == 'summary') {
                 // Generate an optionally trimmed summary of the body field.
@@ -163,7 +163,7 @@ function node_tokens($type, $tokens, array $data = array(), array $options = arr
                   $length = $settings['trim_length'];
                 }
 
-                $output = text_summary($output, $instance['settings']['text_processing'] ? $items[0]['format'] : NULL, $length);
+                $output = text_summary($output, $instance->settings['text_processing'] ? $items[0]['format'] : NULL, $length);
               }
             }
             $replacements[$original] = $output;
diff --git a/core/modules/number/lib/Drupal/number/Plugin/field/formatter/DefaultNumberFormatter.php b/core/modules/number/lib/Drupal/number/Plugin/field/formatter/DefaultNumberFormatter.php
index 86b4aa1..311763c 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/field/formatter/DefaultNumberFormatter.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/field/formatter/DefaultNumberFormatter.php
@@ -72,8 +72,8 @@ public function viewElements(EntityInterface $entity, $langcode, array $items) {
 
       // Account for prefix and suffix.
       if ($this->getSetting('prefix_suffix')) {
-        $prefixes = isset($instance['settings']['prefix']) ? array_map('field_filter_xss', explode('|', $instance['settings']['prefix'])) : array('');
-        $suffixes = isset($instance['settings']['suffix']) ? array_map('field_filter_xss', explode('|', $instance['settings']['suffix'])) : array('');
+        $prefixes = isset($instance->settings['prefix']) ? array_map('field_filter_xss', explode('|', $instance->settings['prefix'])) : array('');
+        $suffixes = isset($instance->settings['suffix']) ? array_map('field_filter_xss', explode('|', $instance->settings['suffix'])) : array('');
         $prefix = (count($prefixes) > 1) ? format_plural($item['value'], $prefixes[0], $prefixes[1]) : $prefixes[0];
         $suffix = (count($suffixes) > 1) ? format_plural($item['value'], $suffixes[0], $suffixes[1]) : $suffixes[0];
         $output = $prefix . $output . $suffix;
diff --git a/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php b/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
index 37c857f..db6e3cd 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php
@@ -70,20 +70,20 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
     }
 
     // Set minimum and maximum.
-    if (is_numeric($instance['settings']['min'])) {
-      $element['#min'] = $instance['settings']['min'];
+    if (is_numeric($instance->settings['min'])) {
+      $element['#min'] = $instance->settings['min'];
     }
-    if (is_numeric($instance['settings']['max'])) {
-      $element['#max'] = $instance['settings']['max'];
+    if (is_numeric($instance->settings['max'])) {
+      $element['#max'] = $instance->settings['max'];
     }
 
     // Add prefix and suffix.
-    if (!empty($instance['settings']['prefix'])) {
-      $prefixes = explode('|', $instance['settings']['prefix']);
+    if (!empty($instance->settings['prefix'])) {
+      $prefixes = explode('|', $instance->settings['prefix']);
       $element['#field_prefix'] = field_filter_xss(array_pop($prefixes));
     }
-    if (!empty($instance['settings']['suffix'])) {
-      $suffixes = explode('|', $instance['settings']['suffix']);
+    if (!empty($instance->settings['suffix'])) {
+      $suffixes = explode('|', $instance->settings['suffix']);
       $element['#field_suffix'] = field_filter_xss(array_pop($suffixes));
     }
 
diff --git a/core/modules/number/number.module b/core/modules/number/number.module
index 4615519..d7af810 100644
--- a/core/modules/number/number.module
+++ b/core/modules/number/number.module
@@ -86,7 +86,7 @@ function number_field_settings_form($field, $instance, $has_data) {
  * Implements hook_field_instance_settings_form().
  */
 function number_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['min'] = array(
     '#type' => 'textfield',
@@ -130,16 +130,16 @@ function number_field_instance_settings_form($field, $instance) {
 function number_field_validate(EntityInterface $entity = NULL, $field, $instance, $langcode, $items, &$errors) {
   foreach ($items as $delta => $item) {
     if ($item['value'] != '') {
-      if (is_numeric($instance['settings']['min']) && $item['value'] < $instance['settings']['min']) {
+      if (is_numeric($instance->settings['min']) && $item['value'] < $instance->settings['min']) {
         $errors[$field['field_name']][$langcode][$delta][] = array(
           'error' => 'number_min',
-          'message' => t('%name: the value may be no less than %min.', array('%name' => $instance['label'], '%min' => $instance['settings']['min'])),
+          'message' => t('%name: the value may be no less than %min.', array('%name' => $instance->label, '%min' => $instance->settings['min'])),
         );
       }
-      if (is_numeric($instance['settings']['max']) && $item['value'] > $instance['settings']['max']) {
+      if (is_numeric($instance->settings['max']) && $item['value'] > $instance->settings['max']) {
         $errors[$field['field_name']][$langcode][$delta][] = array(
           'error' => 'number_max',
-          'message' => t('%name: the value may be no greater than %max.', array('%name' => $instance['label'], '%max' => $instance['settings']['max'])),
+          'message' => t('%name: the value may be no greater than %max.', array('%name' => $instance->label, '%max' => $instance->settings['max'])),
         );
       }
     }
diff --git a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php
index 7e6b4a5..1974c8d 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php
@@ -57,7 +57,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
 
     // Override the title from the incoming $element.
     if ($this->getSetting('display_label')) {
-      $element['#title'] = $this->instance['label'];
+      $element['#title'] = $this->instance->label;
     }
     else {
       $element['#title'] = isset($options[1]) ? $options[1] : '';
diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
index 91f7498..2d03ba5 100644
--- a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
+++ b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php
@@ -124,7 +124,7 @@ function testRadioButtons() {
     // Check that required radios with one option is auto-selected.
     $this->card_1['settings']['allowed_values'] = array(99 => 'Only allowed value');
     field_update_field($this->card_1);
-    $instance['required'] = TRUE;
+    $instance->required = TRUE;
     field_update_instance($instance);
     $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
     $this->assertFieldChecked("edit-card-1-$langcode-99");
@@ -214,7 +214,7 @@ function testCheckBoxes() {
     // Required checkbox with one option is auto-selected.
     $this->card_2['settings']['allowed_values'] = array(99 => 'Only allowed value');
     field_update_field($this->card_2);
-    $instance['required'] = TRUE;
+    $instance->required = TRUE;
     field_update_instance($instance);
     $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
     $this->assertFieldChecked("edit-card-2-$langcode-99");
@@ -261,7 +261,7 @@ function testSelectListSingle() {
     // Submit form: select invalid 'none' option.
     $edit = array("card_1[$langcode]" => '_none');
     $this->drupalPost(NULL, $edit, t('Save'));
-    $this->assertRaw(t('!title field is required.', array('!title' => $instance['field_name'])), 'Cannot save a required field when selecting "none" from the select list.');
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance->getFieldId())), 'Cannot save a required field when selecting "none" from the select list.');
 
     // Submit form: select first option.
     $edit = array("card_1[$langcode]" => 0);
@@ -277,7 +277,7 @@ function testSelectListSingle() {
     $this->assertNoOptionSelected("edit-card-1-$langcode", 2);
 
     // Make the field non required.
-    $instance['required'] = FALSE;
+    $instance->required = FALSE;
     field_update_instance($instance);
 
     // Display form.
@@ -398,7 +398,7 @@ function testSelectListMultiple() {
     $this->assertFieldValues($entity_init, 'card_2', $langcode, array());
 
     // A required select list does not have an empty key.
-    $instance['required'] = TRUE;
+    $instance->required = TRUE;
     field_update_instance($instance);
     $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
     $this->assertFalse($this->xpath('//select[@id=:id]//option[@value=""]', array(':id' => 'edit-card-2-' . $langcode)), 'A required select list does not have an empty key.');
@@ -412,7 +412,7 @@ function testSelectListMultiple() {
     $this->card_2['settings']['allowed_values'] = array();
     $this->card_2['settings']['allowed_values_function'] = 'options_test_allowed_values_callback';
     field_update_field($this->card_2);
-    $instance['required'] = FALSE;
+    $instance->required = FALSE;
     field_update_instance($instance);
 
     // Display form: with no field data, nothing is selected.
diff --git a/core/modules/options/options.module b/core/modules/options/options.module
index 0d8ec00..51d83db 100644
--- a/core/modules/options/options.module
+++ b/core/modules/options/options.module
@@ -141,12 +141,12 @@ function options_field_settings_form($field, $instance, $has_data) {
   }
 
   // Alter the description for allowed values depending on the widget type.
-  if ($instance['widget']['type'] == 'options_onoff') {
+  /*if ($instance['widget']['type'] == 'options_onoff') {
     $form['allowed_values']['#description'] .= '<p>' . t("For a 'single on/off checkbox' widget, define the 'off' value first, then the 'on' value in the <strong>Allowed values</strong> section. Note that the checkbox will be labeled with the label of the 'on' value.") . '</p>';
   }
   elseif ($instance['widget']['type'] == 'options_buttons') {
     $form['allowed_values']['#description'] .= '<p>' . t("The 'checkboxes/radio buttons' widget will display checkboxes if the <em>Number of values</em> option is greater than 1 for this field, otherwise radios will be displayed.") . '</p>';
-  }
+  }*/
   $form['allowed_values']['#description'] .= '<p>' . t('Allowed HTML tags in labels: @tags', array('@tags' => _field_filter_xss_display_allowed_tags())) . '</p>';
 
   $form['allowed_values_function'] = array(
@@ -406,7 +406,7 @@ function options_field_validate(EntityInterface $entity = NULL, $field, $instanc
       if (!empty($allowed_values) && !isset($allowed_values[$item['value']])) {
         $errors[$field['field_name']][$langcode][$delta][] = array(
           'error' => 'list_illegal_value',
-          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
+          'message' => t('%name: illegal value.', array('%name' => $instance->label)),
         );
       }
     }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
index 93fc552..7f5a313 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -598,7 +598,7 @@ public function testComputedProperties() {
   protected function assertComputedProperties($entity_type) {
     // Make the test text field processed.
     $instance = field_info_instance($entity_type, 'field_test_text', $entity_type);
-    $instance['settings']['text_processing'] = 1;
+    $instance->settings['text_processing'] = 1;
     field_update_instance($instance);
 
     $entity = $this->createTestEntity($entity_type);
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
index 3fb464e..083d1d6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUpgradePathTest.php
@@ -222,10 +222,10 @@ function testFieldUpgradeToConfig() {
     // Assume there was only one deleted instance in the test database.
     $uuid_key = key($deleted_instances);
     $deleted_instance = $deleted_instances[$uuid_key];
-    $this->assertEqual($deleted_instance['uuid'], $uuid_key);
-    $this->assertEqual($deleted_instance['id'], 'node.article.test_deleted_field');
+    $this->assertEqual($deleted_instance->uuid, $uuid_key);
+    $this->assertEqual($deleted_instance->id, 'node.article.test_deleted_field');
     // The deleted field uuid and deleted instance field_uuid must match.
-    $this->assertEqual($deleted_field['uuid'], $deleted_instance['field_uuid']);
+    $this->assertEqual($deleted_field['uuid'], $deleted_instance->field_uuid);
 
     // Check that pre-existing deleted field values are read correctly.
     $entity = _field_create_entity_from_ids((object) array(
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
index c85f5e4..1ad5215 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserPictureUpgradePathTest.php
@@ -42,8 +42,8 @@ public function testUserPictureUpgrade() {
 
     // Retrieve the field instance and check for migrated settings.
     $instance = field_info_instance('user', 'user_picture', 'user');
-    $file = entity_load('file', $instance['settings']['default_image'][0]);
-    $this->assertIdentical($instance['settings']['default_image'][0], $file->id(), 'Default user picture has been migrated.');
+    $file = entity_load('file', $instance->settings['default_image'][0]);
+    $this->assertIdentical($instance->settings['default_image'][0], $file->id(), 'Default user picture has been migrated.');
     $this->assertEqual($file->uri, 'public://user_pictures_dir/druplicon.png', 'File id matches the uri expected.');
     $this->assertEqual($file->filename, 'druplicon.png');
     $this->assertEqual($file->langcode, Language::LANGCODE_NOT_SPECIFIED);
@@ -55,10 +55,10 @@ public function testUserPictureUpgrade() {
     $field = field_info_field('user_picture');
     $this->assertTrue(isset($usage['image']['default_image'][$field['uuid']]));
 
-    $this->assertEqual($instance['settings']['max_resolution'], '800x800', 'User picture maximum resolution has been migrated.');
-    $this->assertEqual($instance['settings']['max_filesize'], '700 KB', 'User picture maximum filesize has been migrated.');
-    $this->assertEqual($instance['description'], 'These are user picture guidelines.', 'User picture guidelines are now the user picture field description.');
-    $this->assertEqual($instance['settings']['file_directory'], 'user_pictures_dir', 'User picture directory path has been migrated.');
+    $this->assertEqual($instance->settings['max_resolution'], '800x800', 'User picture maximum resolution has been migrated.');
+    $this->assertEqual($instance->settings['max_filesize'], '700 KB', 'User picture maximum filesize has been migrated.');
+    $this->assertEqual($instance->description, 'These are user picture guidelines.', 'User picture guidelines are now the user picture field description.');
+    $this->assertEqual($instance->settings['file_directory'], 'user_pictures_dir', 'User picture directory path has been migrated.');
 
     $display_options = entity_get_display('user', 'user', 'default')->getComponent('user_picture');
     $this->assertEqual($display_options['settings']['image_style'], 'thumbnail', 'User picture image style setting has been migrated.');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
index e49f31e..bccafdc 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/entity_reference/selection/TermSelection.php
@@ -43,7 +43,7 @@ public static function settingsForm(&$field, &$instance) {
     $form['auto_create'] = array(
       '#type' => 'checkbox',
       '#title' => t("Create referenced entities if they don't already exist"),
-      '#default_value' => $instance['settings']['handler_settings']['auto_create'],
+      '#default_value' => $instance->settings['handler_settings']['auto_create'],
     );
     return $form;
 
@@ -61,7 +61,7 @@ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAI
     $options = array();
 
     $bundles = entity_get_bundles('taxonomy_term');
-    $bundle_names = !empty($this->instance['settings']['handler_settings']['target_bundles']) ? $this->instance['settings']['handler_settings']['target_bundles'] : array_keys($bundles);
+    $bundle_names = !empty($this->instance->settings['handler_settings']['target_bundles']) ? $this->instance->settings['handler_settings']['target_bundles'] : array_keys($bundles);
 
     foreach ($bundle_names as $bundle) {
       if ($vocabulary = entity_load('taxonomy_vocabulary', $bundle)) {
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
index 118e813..3e330b3 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
@@ -96,7 +96,7 @@ function testTaxonomyRss() {
     $edit = array();
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName();
-    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->id();
+    $edit[$this->instance->getFieldId() . '[' . $langcode . '][]'] = $term1->id();
     $this->drupalPost('node/add/article', $edit, t('Save'));
 
     // Check that the term is displayed when the RSS feed is viewed.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
index 2a0907d..a312f3e 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
@@ -55,7 +55,7 @@ function setUp() {
       ))
       ->save();
     entity_get_display('node', 'article', 'default')
-      ->setComponent($this->instance['field_name'], array(
+      ->setComponent($this->instance->getFieldId(), array(
         'type' => 'taxonomy_term_reference_link',
       ))
       ->save();
@@ -113,7 +113,7 @@ function testTaxonomyNode() {
     $langcode = Language::LANGCODE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName();
     $edit["body[$langcode][0][value]"] = $this->randomName();
-    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->id();
+    $edit[$this->instance->getFieldId() . '[' . $langcode . '][]'] = $term1->id();
     $this->drupalPost('node/add/article', $edit, t('Save'));
 
     // Check that the term is displayed when the node is viewed.
@@ -127,7 +127,7 @@ function testTaxonomyNode() {
     $this->assertText($term1->label(), 'Term is displayed after saving the node with no changes.');
 
     // Edit the node with a different term.
-    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term2->id();
+    $edit[$this->instance->getFieldId() . '[' . $langcode . '][]'] = $term2->id();
     $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
 
     $this->drupalGet('node/' . $node->nid);
@@ -146,8 +146,8 @@ function testTaxonomyNode() {
   function testNodeTermCreationAndDeletion() {
     // Enable tags in the vocabulary.
     $instance = $this->instance;
-    entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')
-      ->setComponent($instance['field_name'], array(
+    entity_get_form_display($instance->entity_type, $instance->bundle, 'default')
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'taxonomy_autocomplete',
         'settings' => array(
           'placeholder' => 'Start typing here.',
@@ -167,7 +167,7 @@ function testNodeTermCreationAndDeletion() {
     $edit["body[$langcode][0][value]"] = $this->randomName();
     // Insert the terms in a comma separated list. Vocabulary 1 is a
     // free-tagging field created by the default profile.
-    $edit[$instance['field_name'] . "[$langcode]"] = drupal_implode_tags($terms);
+    $edit[$instance->getFieldId() . "[$langcode]"] = drupal_implode_tags($terms);
 
     // Verify the placeholder is there.
     $this->drupalGet('node/add/article');
@@ -515,8 +515,8 @@ function testTaxonomyGetTermByName() {
   function testReSavingTags() {
     // Enable tags in the vocabulary.
     $instance = $this->instance;
-    entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')
-      ->setComponent($instance['field_name'], array(
+    entity_get_form_display($instance->entity_type, $instance->bundle, 'default')
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'taxonomy_autocomplete',
       ))
       ->save();
@@ -527,7 +527,7 @@ function testReSavingTags() {
     $edit = array();
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = $this->randomName(16);
-    $edit[$this->instance['field_name'] . '[' . $langcode . ']'] = $term->label();
+    $edit[$this->instance->getFieldId() . '[' . $langcode . ']'] = $term->label();
     $this->drupalPost('node/add/article', $edit, t('Save'));
 
     // Check that the term is displayed when editing and saving the node with no
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
index 9bd8b2f..ccfc58d 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
@@ -82,7 +82,7 @@ function testTaxonomyTokenReplacement() {
     // Create node with term2.
     $edit = array();
     $node = $this->drupalCreateNode(array('type' => 'article'));
-    $edit[$this->instance['field_name'] . '[' . $this->langcode . '][]'] = $term2->id();
+    $edit[$this->instance->getFieldId() . '[' . $this->langcode . '][]'] = $term2->id();
     $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
 
     // Generate and test sanitized tokens for term1.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
index 74c546b..06a98b5 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php
@@ -105,20 +105,20 @@ protected function mockStandardInstall() {
     field_create_instance($instance);
 
     entity_get_form_display('node', 'article', 'default')
-      ->setComponent($instance['field_name'], array(
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'taxonomy_autocomplete',
         'weight' => -4,
       ))
       ->save();
 
     entity_get_display('node', 'article', 'default')
-      ->setComponent($instance['field_name'], array(
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
       ->save();
     entity_get_display('node', 'article', 'teaser')
-      ->setComponent($instance['field_name'], array(
+      ->setComponent($instance->getFieldId(), array(
         'type' => 'taxonomy_term_reference_link',
         'weight' => 10,
       ))
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index f1c2e01..0105491 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -986,7 +986,7 @@ function taxonomy_field_validate(EntityInterface $entity = NULL, $field, $instan
       if (!$validate) {
         $errors[$field['field_name']][$langcode][$delta][] = array(
           'error' => 'taxonomy_term_reference_illegal_value',
-          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
+          'message' => t('%name: illegal value.', array('%name' => $instance->label)),
         );
       }
     }
@@ -1204,7 +1204,7 @@ function taxonomy_build_node_index($node) {
     // Collect a unique list of all the term IDs from all node fields.
     $tid_all = array();
     foreach (field_info_instances('node', $node->type) as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $field = field_info_field($field_name);
       if ($field['module'] == 'taxonomy' && $field['storage']['type'] == 'field_sql_storage') {
         // If a field value is not set in the node object when $node->save() is
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextDefaultFormatter.php b/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextDefaultFormatter.php
index 4a96cc3..25ba416 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextDefaultFormatter.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextDefaultFormatter.php
@@ -38,7 +38,7 @@ public function viewElements(EntityInterface $entity, $langcode, array $items) {
     $elements = array();
 
     foreach ($items as $delta => $item) {
-      $output = text_sanitize($this->instance['settings']['text_processing'], $langcode, $item, 'value');
+      $output = text_sanitize($this->instance->settings['text_processing'], $langcode, $item, 'value');
       $elements[$delta] = array('#markup' => $output);
     }
 
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextTrimmedFormatter.php b/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextTrimmedFormatter.php
index 4be366d..b1fcdc5 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextTrimmedFormatter.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/formatter/TextTrimmedFormatter.php
@@ -70,11 +70,11 @@ public function viewElements(EntityInterface $entity, $langcode, array $items) {
 
     foreach ($items as $delta => $item) {
       if ($this->getPluginId() == 'text_summary_or_trimmed' && !empty($item['summary'])) {
-        $output = text_sanitize($this->instance['settings']['text_processing'], $langcode, $item, 'summary');
+        $output = text_sanitize($this->instance->settings['text_processing'], $langcode, $item, 'summary');
       }
       else {
-        $output = text_sanitize($this->instance['settings']['text_processing'], $langcode, $item, 'value');
-        $output = text_summary($output, $this->instance['settings']['text_processing'] ? $item['format'] : NULL, $this->getSetting('trim_length'));
+        $output = text_sanitize($this->instance->settings['text_processing'], $langcode, $item, 'value');
+        $output = text_summary($output, $this->instance->settings['text_processing'] ? $item['format'] : NULL, $this->getSetting('trim_length'));
       }
       $elements[$delta] = array('#markup' => $output);
     }
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
index 496ea12..7f92ad6 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php
@@ -61,7 +61,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#attributes' => array('class' => array('text-full')),
     );
 
-    if ($this->instance['settings']['text_processing']) {
+    if ($this->instance->settings['text_processing']) {
       $element = $main_widget;
       $element['#type'] = 'text_format';
       $element['#format'] = isset($items[$delta]['format']) ? $items[$delta]['format'] : NULL;
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
index b3a68ac..6e5d09f 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php
@@ -35,7 +35,7 @@ class TextareaWithSummaryWidget extends TextareaWidget {
   function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
     $element = parent::formElement($items, $delta, $element, $langcode, $form, $form_state);
 
-    $display_summary = !empty($items[$delta]['summary']) || $this->instance['settings']['display_summary'];
+    $display_summary = !empty($items[$delta]['summary']) || $this->instance->settings['display_summary'];
     $element['summary'] = array(
       '#type' => $display_summary ? 'textarea' : 'value',
       '#default_value' => isset($items[$delta]['summary']) ? $items[$delta]['summary'] : NULL,
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
index a6e26b7..f1e1cad 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php
@@ -62,7 +62,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr
       '#attributes' => array('class' => array('text-full')),
     );
 
-    if ($this->instance['settings']['text_processing']) {
+    if ($this->instance->settings['text_processing']) {
       $element = $main_widget;
       $element['#type'] = 'text_format';
       $element['#format'] = isset($items[$delta]['format']) ? $items[$delta]['format'] : NULL;
diff --git a/core/modules/text/lib/Drupal/text/TextProcessed.php b/core/modules/text/lib/Drupal/text/TextProcessed.php
index 3a44722..c575c0d 100644
--- a/core/modules/text/lib/Drupal/text/TextProcessed.php
+++ b/core/modules/text/lib/Drupal/text/TextProcessed.php
@@ -69,7 +69,7 @@ public function getValue($langcode = NULL) {
     $entity = $field->getParent();
     $instance = field_info_instance($entity->entityType(), $field->getName(), $entity->bundle());
 
-    if (!empty($instance['settings']['text_processing']) && $this->format->getValue()) {
+    if (!empty($instance->settings['text_processing']) && $this->format->getValue()) {
       return check_markup($this->text->getValue(), $this->format->getValue(), $entity->language()->langcode);
     }
     else {
diff --git a/core/modules/text/text.module b/core/modules/text/text.module
index 4fe2115..4d3d2fa 100644
--- a/core/modules/text/text.module
+++ b/core/modules/text/text.module
@@ -110,7 +110,7 @@ function text_field_settings_form($field, $instance, $has_data) {
  * Implements hook_field_instance_settings_form().
  */
 function text_field_instance_settings_form($field, $instance) {
-  $settings = $instance['settings'];
+  $settings = $instance->settings;
 
   $form['text_processing'] = array(
     '#type' => 'radios',
@@ -149,11 +149,11 @@ function text_field_validate(EntityInterface $entity = NULL, $field, $instance,
         if (!empty($field['settings']['max_length']) && drupal_strlen($item[$column]) > $field['settings']['max_length']) {
           switch ($column) {
             case 'value':
-              $message = t('%name: the text may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length']));
+              $message = t('%name: the text may not be longer than %max characters.', array('%name' => $instance->label, '%max' => $field['settings']['max_length']));
               break;
 
             case 'summary':
-              $message = t('%name: the summary may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length']));
+              $message = t('%name: the summary may not be longer than %max characters.', array('%name' => $instance->label, '%max' => $field['settings']['max_length']));
               break;
           }
           $errors[$field['field_name']][$langcode][$delta][] = array(
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
index 906248a..b5c35b8 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/EntityTranslationController.php
@@ -50,7 +50,7 @@ public function removeTranslation(EntityInterface $entity, $langcode) {
     // @todo Handle properties.
     // Remove field translations.
     foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $field = field_info_field($field_name);
       if ($field['translatable']) {
         $entity->{$field_name}[$langcode] = array();
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
index 261dfe1..93559ae 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/FieldTranslationSynchronizer.php
@@ -62,10 +62,10 @@ public function synchronizeFields(EntityInterface $entity, $sync_langcode, $orig
 
       // Sync when the field is not empty, when the synchronization translations
       // setting is set, and the field is translatable.
-      if (!empty($entity->{$field_name}) && !empty($instance['settings']['translation_sync']) && field_is_translatable($entity_type, $field)) {
+      if (!empty($entity->{$field_name}) && !empty($instance->settings['translation_sync']) && field_is_translatable($entity_type, $field)) {
         // Retrieve all the untranslatable column groups and merge them into
         // single list.
-        $groups = array_keys(array_diff($instance['settings']['translation_sync'], array_filter($instance['settings']['translation_sync'])));
+        $groups = array_keys(array_diff($instance->settings['translation_sync'], array_filter($instance->settings['translation_sync'])));
         if (!empty($groups)) {
           $columns = array();
           foreach ($groups as $group) {
diff --git a/core/modules/translation_entity/translation_entity.admin.inc b/core/modules/translation_entity/translation_entity.admin.inc
index dd7874c..31b3b4f 100644
--- a/core/modules/translation_entity/translation_entity.admin.inc
+++ b/core/modules/translation_entity/translation_entity.admin.inc
@@ -39,7 +39,7 @@ function translation_entity_field_sync_widget(Field $field, FieldInstance $insta
       '#type' => 'checkboxes',
       '#title' => t('Translatable elements'),
       '#options' => $options,
-      '#default_value' => !empty($instance['settings']['translation_sync']) ? $instance['settings']['translation_sync'] : $default,
+      '#default_value' => !empty($instance->settings['translation_sync']) ? $instance->settings['translation_sync'] : $default,
       '#attached' => array(
         'library' => array(
           array('translation_entity', 'drupal.translation_entity.admin'),
@@ -97,7 +97,7 @@ function _translation_entity_form_language_content_settings_form_alter(array &$f
           foreach ($fields as $field_name => $instance) {
             $field = field_info_field($field_name);
             $form['settings'][$entity_type][$bundle]['fields'][$field_name] = array(
-              '#label' => $instance['label'],
+              '#label' => $instance->label,
               '#type' => 'checkbox',
               '#default_value' => $field['translatable'],
             );
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index 1ef2df5..ab84d61 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -621,7 +621,7 @@ function translation_entity_form_alter(array &$form, array &$form_state) {
       }
       else {
         foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-          $field_name = $instance['field_name'];
+          $field_name = $instance->getFieldId();
           $field = field_info_field($field_name);
           $form[$field_name]['#multilingual'] = !empty($field['translatable']);
         }
@@ -656,9 +656,9 @@ function translation_entity_field_language_alter(&$display_language, $context) {
           //   entity language and with Language::LANGCODE_DEFAULT. We need need to unset
           //   both until we remove the BC layer.
           if ($langcode == $entity_langcode) {
-            unset($entity->{$instance['field_name']}[Language::LANGCODE_DEFAULT]);
+            unset($entity->{$instance->getFieldId()}[Language::LANGCODE_DEFAULT]);
           }
-          unset($entity->{$instance['field_name']}[$langcode]);
+          unset($entity->{$instance->getFieldId()}[$langcode]);
         }
       }
     }
@@ -1020,12 +1020,12 @@ function translation_entity_save_settings($settings) {
             $field = field_info_field($field_name);
             $instance = field_info_instance($entity_type, $field_name, $bundle);
             if ($field['translatable']) {
-              $instance['settings']['translation_sync'] = $column_settings;
+              $instance->settings['translation_sync'] = $column_settings;
             }
             // If the field does not have translatable enabled we need to reset
             // the sync settings to their defaults.
             else {
-              unset($instance['settings']['translation_sync']);
+              unset($instance->settings['translation_sync']);
             }
             field_update_instance($instance);
           }
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index c7de9e2..5aa5247 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -40,7 +40,7 @@ function translation_entity_overview(EntityInterface $entity) {
     // Determine whether the current entity is translatable.
     $translatable = FALSE;
     foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
-      $field_name = $instance['field_name'];
+      $field_name = $instance->getFieldId();
       $field = field_info_field($field_name);
       if ($field['translatable']) {
         $translatable = TRUE;
diff --git a/core/modules/user/lib/Drupal/user/Plugin/entity_reference/selection/UserSelection.php b/core/modules/user/lib/Drupal/user/Plugin/entity_reference/selection/UserSelection.php
index 49f00a5..ee7fb6a 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/entity_reference/selection/UserSelection.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/entity_reference/selection/UserSelection.php
@@ -32,7 +32,7 @@ class UserSelection extends SelectionBase {
    */
   public static function settingsForm(&$field, &$instance) {
     // Merge in default values.
-    $instance['settings']['handler_settings'] += array(
+    $instance->settings['handler_settings'] += array(
       'filter' => array(
         'type' => '_none',
       ),
@@ -48,7 +48,7 @@ public static function settingsForm(&$field, &$instance) {
       ),
       '#ajax' => TRUE,
       '#limit_validation_errors' => array(),
-      '#default_value' => $instance['settings']['handler_settings']['filter']['type'],
+      '#default_value' => $instance->settings['handler_settings']['filter']['type'],
     );
 
     $form['filter']['settings'] = array(
@@ -57,9 +57,9 @@ public static function settingsForm(&$field, &$instance) {
       '#process' => array('_entity_reference_form_process_merge_parent'),
     );
 
-    if ($instance['settings']['handler_settings']['filter']['type'] == 'role') {
+    if ($instance->settings['handler_settings']['filter']['type'] == 'role') {
       // Merge in default values.
-      $instance['settings']['handler_settings']['filter'] += array(
+      $instance->settings['handler_settings']['filter'] += array(
         'role' => NULL,
       );
 
@@ -68,7 +68,7 @@ public static function settingsForm(&$field, &$instance) {
         '#title' => t('Restrict to the selected roles'),
         '#required' => TRUE,
         '#options' => array_diff_key(user_role_names(TRUE), drupal_map_assoc(array(DRUPAL_AUTHENTICATED_RID))),
-        '#default_value' => $instance['settings']['handler_settings']['filter']['role'],
+        '#default_value' => $instance->settings['handler_settings']['filter']['role'],
       );
     }
 
@@ -133,8 +133,8 @@ public function entityQueryAlter(SelectInterface $query) {
     }
 
     // Add the filter by role option.
-    if (!empty($this->instance['settings']['handler_settings']['filter'])) {
-      $filter_settings = $this->instance['settings']['handler_settings']['filter'];
+    if (!empty($this->instance->settings['handler_settings']['filter'])) {
+      $filter_settings = $this->instance->settings['handler_settings']['filter'];
       if ($filter_settings['type'] == 'role') {
         $tables = $query->getTables();
         $base_table = $tables['base_table']['alias'];
diff --git a/core/modules/user/lib/Drupal/user/RegisterFormController.php b/core/modules/user/lib/Drupal/user/RegisterFormController.php
index ceecd65..2acf0a6 100644
--- a/core/modules/user/lib/Drupal/user/RegisterFormController.php
+++ b/core/modules/user/lib/Drupal/user/RegisterFormController.php
@@ -44,7 +44,7 @@ public function form(array $form, array &$form_state) {
     // setting is not on.
     field_attach_form($account, $form, $form_state);
     foreach (field_info_instances('user', 'user') as $field_name => $instance) {
-      if (empty($instance['settings']['user_register_form'])) {
+      if (empty($instance->settings['user_register_form'])) {
         $form[$field_name]['#access'] = FALSE;
       }
     }
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
index 8da2c2b..f2a166b 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
@@ -216,13 +216,13 @@ function testRegistrationWithUserFields() {
 
     // Check that the field does not appear on the registration form.
     $this->drupalGet('user/register');
-    $this->assertNoText($instance['label'], 'The field does not appear on user registration form');
+    $this->assertNoText($instance->label, 'The field does not appear on user registration form');
 
     // Have the field appear on the registration form.
-    $instance['settings']['user_register_form'] = TRUE;
+    $instance->settings['user_register_form'] = TRUE;
     field_update_instance($instance);
     $this->drupalGet('user/register');
-    $this->assertText($instance['label'], 'The field appears on user registration form');
+    $this->assertText($instance->label, 'The field appears on user registration form');
 
     // Check that validation errors are correctly reported.
     $edit = array();
@@ -231,11 +231,11 @@ function testRegistrationWithUserFields() {
     // Missing input in required field.
     $edit['test_user_field[und][0][value]'] = '';
     $this->drupalPost(NULL, $edit, t('Create new account'));
-    $this->assertRaw(t('@name field is required.', array('@name' => $instance['label'])), 'Field validation error was correctly reported.');
+    $this->assertRaw(t('@name field is required.', array('@name' => $instance->label)), 'Field validation error was correctly reported.');
     // Invalid input.
     $edit['test_user_field[und][0][value]'] = '-1';
     $this->drupalPost(NULL, $edit, t('Create new account'));
-    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $instance['label'])), 'Field validation error was correctly reported.');
+    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $instance->label)), 'Field validation error was correctly reported.');
 
     // Submit with valid data.
     $value = rand(1, 255);
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 593d35a..aad5e0e 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -2556,7 +2556,7 @@ function user_block_user_action(&$entity, $context = array()) {
 function user_form_field_ui_field_instance_edit_form_alter(&$form, &$form_state, $form_id) {
   $instance = $form_state['instance'];
 
-  if ($instance['entity_type'] == 'user') {
+  if ($instance->entity_type == 'user') {
     $form['instance']['settings']['user_register_form'] = array(
       '#type' => 'checkbox',
       '#title' => t('Display on user registration form.'),
@@ -2564,7 +2564,7 @@ function user_form_field_ui_field_instance_edit_form_alter(&$form, &$form_state,
       // Field instances created in D7 beta releases before the setting was
       // introduced might be set as 'required' and 'not shown on user_register
       // form'. We make sure the checkbox comes as 'checked' for those.
-      '#default_value' => $instance['settings']['user_register_form'] || $instance['required'],
+      '#default_value' => $instance->settings['user_register_form'] || $instance->required,
       // Display just below the 'required' checkbox.
       '#weight' => $form['instance']['required']['#weight'] + .1,
       // Disabled when the 'required' checkbox is checked.
@@ -2591,7 +2591,7 @@ function user_form_field_ui_field_instance_edit_form_alter(&$form, &$form_state,
 function user_form_field_ui_field_instance_edit_form_submit($form, &$form_state) {
   $instance = $form_state['values']['instance'];
 
-  if (!empty($instance['required'])) {
+  if (!empty($instance->required)) {
     form_set_value($form['instance']['settings']['user_register_form'], 1, $form_state);
   }
 }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
index f872f7d..dc4b976 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
@@ -46,7 +46,7 @@ public function __construct($field, $instance = NULL, EntityInterface $entity =
    * Implements \Drupal\entity_reference\Plugin\Type\Selection\SelectionInterface::settingsForm().
    */
   public static function settingsForm(&$field, &$instance) {
-    $view_settings = empty($instance['settings']['handler_settings']['view']) ? array() : $instance['settings']['handler_settings']['view'];
+    $view_settings = empty($instance->settings['handler_settings']['view']) ? array() : $instance->settings['handler_settings']['view'];
     $displays = views_get_applicable_views('entity_reference_display');
     // Filter views that list the entity type we want, and group the separate
     // displays by view.
@@ -117,13 +117,13 @@ public static function settingsForm(&$field, &$instance) {
    *   Return TRUE if the view was initialized, FALSE otherwise.
    */
   protected function initializeView($match = NULL, $match_operator = 'CONTAINS', $limit = 0, $ids = NULL) {
-    $view_name = $this->instance['settings']['handler_settings']['view']['view_name'];
-    $display_name = $this->instance['settings']['handler_settings']['view']['display_name'];
+    $view_name = $this->instance->settings['handler_settings']['view']['view_name'];
+    $display_name = $this->instance->settings['handler_settings']['view']['display_name'];
 
     // Check that the view is valid and the display still exists.
     $this->view = views_get_view($view_name);
     if (!$this->view || !$this->view->access($display_name)) {
-      drupal_set_message(t('The reference view %view_name used in the %field_name field cannot be found.', array('%view_name' => $view_name, '%field_name' => $this->instance['label'])), 'warning');
+      drupal_set_message(t('The reference view %view_name used in the %field_name field cannot be found.', array('%view_name' => $view_name, '%field_name' => $this->instance->label)), 'warning');
       return FALSE;
     }
     $this->view->setDisplay($display_name);
@@ -143,8 +143,8 @@ protected function initializeView($match = NULL, $match_operator = 'CONTAINS', $
    * Implements \Drupal\entity_reference\Plugin\Type\Selection\SelectionInterface::getReferencableEntities().
    */
   public function getReferencableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
-    $display_name = $this->instance['settings']['handler_settings']['view']['display_name'];
-    $arguments = $this->instance['settings']['handler_settings']['view']['arguments'];
+    $display_name = $this->instance->settings['handler_settings']['view']['display_name'];
+    $arguments = $this->instance->settings['handler_settings']['view']['arguments'];
     $result = array();
     if ($this->initializeView($match, $match_operator, $limit)) {
       // Get the results.
@@ -173,8 +173,8 @@ public function countReferencableEntities($match = NULL, $match_operator = 'CONT
    * Implements \Drupal\entity_reference\Plugin\Type\Selection\SelectionInterface::validateReferencableEntities().
    */
   public function validateReferencableEntities(array $ids) {
-    $display_name = $this->instance['settings']['handler_settings']['view']['display_name'];
-    $arguments = $this->instance['settings']['handler_settings']['view']['arguments'];
+    $display_name = $this->instance->settings['handler_settings']['view']['display_name'];
+    $arguments = $this->instance->settings['handler_settings']['view']['arguments'];
     $result = array();
     if ($this->initializeView(NULL, 'CONTAINS', 0, $ids)) {
       // Get the results.
diff --git a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
index bb52895..5617d9c 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
@@ -188,7 +188,7 @@ function testTaggedWithByNodeType() {
     // If we add an instance of the tagging field to the second node type, the
     // "tagged with" form element should not appear for it too.
     $instance = $this->tag_instance;
-    $instance['bundle'] = $this->node_type_without_tags->type;
+    $instance->bundle = $this->node_type_without_tags->type;
     field_create_instance($instance);
     entity_get_form_display('node', $this->node_type_without_tags->type, 'default')
       ->setComponent('field_views_testing_tags', array(
