diff --git a/core/lib/Drupal/Core/Entity/Annotation/FieldType.php b/core/lib/Drupal/Core/Entity/Annotation/FieldType.php
index 1de71b5..0ab92a7 100644
--- a/core/lib/Drupal/Core/Entity/Annotation/FieldType.php
+++ b/core/lib/Drupal/Core/Entity/Annotation/FieldType.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Entity\Annotation;
 
 use Drupal\Component\Annotation\Plugin;
+use Drupal\Core\TypedData\Annotation\DataType;
 
 /**
  * Defines a FieldType annotation object.
@@ -17,7 +18,7 @@
  *
  * @Annotation
  */
-class FieldType extends Plugin {
+class FieldType extends DataType {
 
   /**
    * The plugin ID.
@@ -103,8 +104,6 @@ class FieldType extends Plugin {
   /**
    * A boolean stating that fields of this type are configurable.
    *
-   * @todo: Make field module respect this.
-   *
    * @var boolean
    */
   public $configurable = TRUE;
@@ -112,10 +111,16 @@ class FieldType extends Plugin {
   /**
    * A boolean stating that fields of this type cannot be created through the UI.
    *
-   * If TRUE, fields of this type can only be created programmatically.
+   * If TRUE or the field type is not configurable, fields of this type can only
+   * be created programmatically.
    *
    * @var boolean
    */
   public $no_ui = FALSE;
 
+  /**
+   * {@inheritdoc}
+   */
+  public $list_class;
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index fd1dc38..892eb07 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\Entity;
 
-use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
+use Drupal\Core\Entity\Plugin\field\field_type\EntityReferenceItem;
 use Drupal\Core\Language\Language;
 use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\Core\TypedData\TypedDataInterface;
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 67e5690..18a5f67 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -477,8 +477,16 @@ public function getFieldDefinitions($entity_type, $bundle = NULL) {
       }
       else {
         $class = $this->factory->getPluginClass($entity_type, $this->getDefinition($entity_type));
+
+        $base_definitions = $class::baseFieldDefinitions($entity_type);
+        foreach ($base_definitions as &$base_definition) {
+          // Support old-style field types to avoid that all base field
+          // definitions need to be changed.
+          // @todo: Remove after https://drupal.org/node/2047229.
+          $base_definition['type'] = preg_replace('/(.+)_field/', 'field_item:$1', $base_definition['type']);
+        }
         $this->entityFieldInfo[$entity_type] = array(
-          'definitions' => $class::baseFieldDefinitions($entity_type),
+          'definitions' => $base_definitions,
           // Contains definitions of optional (per-bundle) fields.
           'optional' => array(),
           // An array keyed by bundle name containing the optional fields added
diff --git a/core/lib/Drupal/Core/Entity/Field/FieldTypePluginManager.php b/core/lib/Drupal/Core/Entity/Field/FieldTypePluginManager.php
index ad29168..2261ca7 100644
--- a/core/lib/Drupal/Core/Entity/Field/FieldTypePluginManager.php
+++ b/core/lib/Drupal/Core/Entity/Field/FieldTypePluginManager.php
@@ -8,6 +8,7 @@
 
 namespace Drupal\Core\Entity\Field;
 
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\LanguageManager;
@@ -25,7 +26,6 @@ class FieldTypePluginManager extends DefaultPluginManager {
   protected $defaults = array(
     'settings' => array(),
     'instance_settings' => array(),
-    'list_class' => '\Drupal\field\Plugin\Type\FieldType\ConfigFieldItemList',
   );
 
   /**
@@ -52,6 +52,20 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function processDefinition(&$definition, $plugin_id) {
+    parent::processDefinition($definition, $plugin_id);
+    if ($definition['configurable']) {
+      $definition['list_class'] = '\Drupal\field\Plugin\Type\FieldType\ConfigFieldItemList';
+    }
+    else {
+      $definition['list_class'] = '\Drupal\Core\Entity\Field\FieldItemList';
+    }
+  }
+
+
+  /**
    * Returns the default field-level settings for a field type.
    *
    * @param string $type
@@ -81,4 +95,27 @@ public function getDefaultInstanceSettings($type) {
     return isset($info['instance_settings']) ? $info['instance_settings'] : array();
   }
 
+  /**
+   * Gets the definition of all field types.
+   *
+   * @param Boolean $configurable
+   *   Configurable flag to indicate whether return configurable field types.
+   *
+   * @return array
+   *   An array of field type definitions.
+   */
+  public function getDefinitions($configurable = NULL) {
+    $definitions = $this->getCachedDefinitions();
+    if (!isset($definitions)) {
+      $definitions = $this->findDefinitions();
+      $this->setCachedDefinitions($definitions);
+    }
+    if ($configurable) {
+      return array_filter($this->definitions, function ($defintion) {
+        return $defintion['configurable'];
+      });
+    }
+    return $definitions;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/EmailItem.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/EmailItem.php
deleted file mode 100644
index 6d1dba6..0000000
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/EmailItem.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\EmailItem.
- */
-
-namespace Drupal\Core\Entity\Plugin\DataType;
-
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Entity\Field\FieldItemBase;
-use Drupal\field\Plugin\field\field_type\LegacyConfigFieldItem;
-
-/**
- * Defines the 'email_field' entity field item.
- *
- * @DataType(
- *   id = "email_field",
- *   label = @Translation("E-mail field item"),
- *   description = @Translation("An entity field containing an e-mail value."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
- * )
- */
-class EmailItem extends LegacyConfigFieldItem {
-
-  /**
-   * Definitions of the contained properties.
-   *
-   * @see EmailItem::getPropertyDefinitions()
-   *
-   * @var array
-   */
-  static $propertyDefinitions;
-
-  /**
-   * Implements ComplexDataInterface::getPropertyDefinitions().
-   */
-  public function getPropertyDefinitions() {
-
-    if (!isset(static::$propertyDefinitions)) {
-      static::$propertyDefinitions['value'] = array(
-        'type' => 'email',
-        'label' => t('E-mail value'),
-      );
-    }
-    return static::$propertyDefinitions;
-  }
-
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isEmpty() {
-    return $this->value === NULL || $this->value === '';
-  }
-}
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/BooleanItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/BooleanItem.php
similarity index 65%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/BooleanItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/BooleanItem.php
index 31e3ec8..e60cdd4 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/BooleanItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/BooleanItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\BooleanItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\BooleanItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'boolean_field' entity field item.
+ * Defines the 'boolean' entity field type.
  *
- * @DataType(
- *   id = "boolean_field",
- *   label = @Translation("Boolean field item"),
+ * @FieldType(
+ *   id = "boolean",
+ *   label = @Translation("Boolean"),
  *   description = @Translation("An entity field containing a boolean value."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class BooleanItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/DateItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/DateItem.php
similarity index 65%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/DateItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/DateItem.php
index e6f462f..5245abb 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/DateItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/DateItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\DateItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\DateItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'date_field' entity field item.
+ * Defines the 'date' entity field type.
  *
- * @DataType(
- *   id = "date_field",
- *   label = @Translation("Date field item"),
+ * @FieldType(
+ *   id = "date",
+ *   label = @Translation("Date"),
  *   description = @Translation("An entity field containing a date value."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class DateItem extends FieldItemBase {
diff --git a/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/EmailItem.php
similarity index 61%
rename from core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/EmailItem.php
index b346c4b..e1b70b6 100644
--- a/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/EmailItem.php
@@ -2,28 +2,55 @@
 
 /**
  * @file
- * Contains \Drupal\email\Plugin\field\field_type\ConfigurableEmailItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\EmailItem.
  */
 
-namespace Drupal\email\Plugin\field\field_type;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\Entity\Annotation\FieldType;
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Entity\Plugin\DataType\EmailItem;
 use Drupal\field\FieldInterface;
+use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemBase;
 
 /**
- * Plugin implementation of the 'email' field type.
+ * Defines the 'email' entity field type.
  *
  * @FieldType(
  *   id = "email",
  *   label = @Translation("E-mail"),
- *   description = @Translation("This field stores an e-mail address in the database."),
- *   default_widget = "email_default",
- *   default_formatter = "email_mailto"
+ *   description = @Translation("An entity field containing an e-mail value.")
  * )
  */
-class ConfigurableEmailItem extends EmailItem {
+class EmailItem extends ConfigFieldItemBase {
+
+  /**
+   * Definitions of the contained properties.
+   *
+   * @see EmailItem::getPropertyDefinitions()
+   *
+   * @var array
+   */
+  static $propertyDefinitions;
+
+  /**
+   * Implements ComplexDataInterface::getPropertyDefinitions().
+   */
+  public function getPropertyDefinitions() {
+
+    if (!isset(static::$propertyDefinitions)) {
+      static::$propertyDefinitions['value'] = array(
+        'type' => 'email',
+        'label' => t('E-mail value'),
+      );
+    }
+    return static::$propertyDefinitions;
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    return $this->value === NULL || $this->value === '';
+  }
 
   /**
    * Defines the max length for an email address
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/EntityReferenceItem.php
similarity index 92%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/EntityReferenceItem.php
index 5654747..4891b5e 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/EntityReferenceItem.php
@@ -2,10 +2,10 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\EntityReferenceItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
 use Drupal\Core\TypedData\Annotation\DataType;
 use Drupal\Core\Annotation\Translation;
@@ -13,7 +13,7 @@
 use Drupal\Core\TypedData\TypedDataInterface;
 
 /**
- * Defines the 'entity_reference_item' entity field item.
+ * Defines the 'entity_reference' entity field type.
  *
  * Supported settings (below the definition's 'settings' key) are:
  * - target_type: The entity type to reference. Required.
@@ -21,11 +21,11 @@
  *   may be referenced. May be set to an single bundle, or to an array of
  *   allowed bundles.
  *
- * @DataType(
- *   id = "entity_reference_field",
- *   label = @Translation("Entity reference field item"),
+ * @FieldType(
+ *   id = "entity_reference",
+ *   label = @Translation("Entity reference"),
  *   description = @Translation("An entity field containing an entity reference."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList",
+ *   configurable = false,
  *   constraints = {"ValidReference" = TRUE}
  * )
  */
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/FloatItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/FloatItem.php
similarity index 67%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/FloatItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/FloatItem.php
index 5cd50f9..6e35ac4 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/FloatItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/FloatItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\FloatItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\FloatItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'float_field' entity field item.
+ * Defines the 'float' entity field type.
  *
  * @DataType(
- *   id = "float_field",
- *   label = @Translation("Float field item"),
+ *   id = "float",
+ *   label = @Translation("Float"),
  *   description = @Translation("An entity field containing an float value."),
- *   list_class = "\Drupal\Core\Entity\Field\Field"
+ *   configurable = false,
  * )
  */
 class FloatItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/IntegerItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/IntegerItem.php
similarity index 65%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/IntegerItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/IntegerItem.php
index 6bd8cf8..5142dfc 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/IntegerItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/IntegerItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\IntegerItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\IntegerItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'integer_field' entity field item.
+ * Defines the 'integer' entity field type.
  *
- * @DataType(
- *   id = "integer_field",
- *   label = @Translation("Integer field item"),
+ * @FieldType(
+ *   id = "integer",
+ *   label = @Translation("Integer"),
  *   description = @Translation("An entity field containing an integer value."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class IntegerItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/LanguageItem.php
similarity index 87%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/LanguageItem.php
index b156a34..e0ec10b 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/LanguageItem.php
@@ -2,24 +2,22 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\LanguageItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\LanguageItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 use Drupal\Core\Language\Language;
 
 /**
- * Defines the 'language_field' entity field item.
+ * Defines the 'language' entity field item.
  *
- * @DataType(
- *   id = "language_field",
- *   label = @Translation("Language field item"),
+ * @FieldType(
+ *   id = "language",
+ *   label = @Translation("Language"),
  *   description = @Translation("An entity field referencing a language."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList",
+ *   configurable = false,
  *   constraints = {
  *     "ComplexData" = {
  *       "value" = {"Length" = {"max" = 12}}
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/StringItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/StringItem.php
similarity index 65%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/StringItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/StringItem.php
index a243567..a0008a9 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/StringItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/StringItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\StringItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\StringItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'string_field' entity field item.
+ * Defines the 'string' entity field type.
  *
- * @DataType(
- *   id = "string_field",
- *   label = @Translation("String field item"),
+ * @FieldType(
+ *   id = "string",
+ *   label = @Translation("String"),
  *   description = @Translation("An entity field containing a string value."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class StringItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/UriItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/UriItem.php
similarity index 64%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/UriItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/UriItem.php
index 6ce5970..2a268c8 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/UriItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/UriItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\UriItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\UriItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'uri_field' entity field item.
+ * Defines the 'uri' entity field type.
  *
- * @DataType(
- *   id = "uri_field",
- *   label = @Translation("URI field item"),
+ * @FieldType(
+ *   id = "uri",
+ *   label = @Translation("URI"),
  *   description = @Translation("An entity field containing a URI."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class UriItem extends FieldItemBase {
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/UuidItem.php b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/UuidItem.php
similarity index 60%
rename from core/lib/Drupal/Core/Entity/Plugin/DataType/UuidItem.php
rename to core/lib/Drupal/Core/Entity/Plugin/field/field_type/UuidItem.php
index 3e28741..5e3e8e7 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/UuidItem.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/field/field_type/UuidItem.php
@@ -2,24 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Plugin\DataType\UuidItem.
+ * Contains \Drupal\Core\Entity\Plugin\field\field_type\UuidItem.
  */
 
-namespace Drupal\Core\Entity\Plugin\DataType;
-
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
+namespace Drupal\Core\Entity\Plugin\field\field_type;
 
 /**
- * Defines the 'uuid_field' entity field item.
+ * Defines the 'uuid' entity field type.
  *
  * The field uses a newly generated UUID as default value.
  *
- * @DataType(
- *   id = "uuid_field",
- *   label = @Translation("UUID field item"),
+ * @FieldType(
+ *   id = "uuid",
+ *   label = @Translation("UUID"),
  *   description = @Translation("An entity field containing a UUID."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList",
+ *   configurable = false,
  *   constraints = {
  *     "ComplexData" = {
  *       "value" = {"Length" = {"max" = 128}}
diff --git a/core/modules/comment/lib/Drupal/comment/CommentFieldName.php b/core/modules/comment/lib/Drupal/comment/CommentFieldName.php
index 24bbff7..9f6daa8 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentFieldName.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentFieldName.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\comment;
 
-use Drupal\Core\Entity\Plugin\DataType\StringItem;
+use Drupal\Core\Entity\Plugin\field\field_type\StringItem;
 
 /**
  * The field item for the 'fieldname' field.
diff --git a/core/modules/email/email.module b/core/modules/email/email.module
index 5a5f116..d77df82 100644
--- a/core/modules/email/email.module
+++ b/core/modules/email/email.module
@@ -31,9 +31,13 @@ function email_help($path, $arg) {
  * Implements hook_field_info_alter().
  */
 function email_field_info_alter(&$info) {
+ $info['email']['default_widget'] = 'email_default';
   if (\Drupal::moduleHandler()->moduleExists('text')) {
     $info['email']['default_formatter'] = 'text_plain';
   }
+  else {
+    $info['email']['default_formatter'] = 'email_mailto';
+  }
 }
 
 /**
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
index 6b3c137..18cb2e0 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigEntityReferenceItemBase.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\field\Plugin\Type\FieldType;
 
-use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
+use Drupal\Core\Entity\Plugin\field\field_type\EntityReferenceItem;
 use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
 use Drupal\field\FieldInterface;
 use Drupal\field\FieldInstanceInterface;
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemList.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemList.php
index 32bea80..eca3358 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemList.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemList.php
@@ -40,7 +40,15 @@ public function getFieldDefinition() {
     if (!isset($this->instance)) {
       $entity = $this->getEntity();
       $instances = FieldAPI::fieldInfo()->getBundleInstances($entity->entityType(), $entity->bundle());
-      $this->instance = $instances[$this->getName()];
+      if (isset($instances[$this->getName()])) {
+        $this->instance = $instances[$this->getName()];
+      }
+      else {
+        // For base fields, fall back to the parent implementation.
+        // @todo: Inject the field definition with
+        //   https://drupal.org/node/2047229.
+        return parent::getFieldDefinition();
+      }
     }
     return $this->instance;
   }
diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/LegacyFieldTypeDiscoveryDecorator.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/LegacyFieldTypeDiscoveryDecorator.php
index c21a3f6..d170085 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/LegacyFieldTypeDiscoveryDecorator.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/LegacyFieldTypeDiscoveryDecorator.php
@@ -63,11 +63,10 @@ public function getDefinitions() {
       $function = $module . '_field_info';
       if (function_exists($function)) {
         foreach ($function() as $plugin_id => $definition) {
-          $definition += array(
-            'id' => $plugin_id,
-            'provider' => $module,
-            'list_class' => '\Drupal\field\Plugin\field\field_type\LegacyConfigFieldItemList',
-          );
+          $definition['id'] = $plugin_id;
+          $definition['provider'] = $module;
+          $definition['configurable'] = TRUE;
+          $definition['list_class'] = '\Drupal\field\Plugin\field\field_type\LegacyConfigFieldItemList';
           $definitions[$plugin_id] = $definition;
         }
       }
diff --git a/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php b/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
index fc6be34..eb12619 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/field/field_type/FileItem.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Annotation\FieldType;
-use Drupal\Core\Entity\Plugin\DataType\EntityReferenceItem;
+use Drupal\Core\Entity\Plugin\field\field_type\EntityReferenceItem;
 use Drupal\field\FieldInterface;
 use Drupal\field\Plugin\Type\FieldType\ConfigFieldItemInterface;
 
diff --git a/core/modules/node/tests/modules/node_access_test/node_access_test.module b/core/modules/node/tests/modules/node_access_test/node_access_test.module
index 793c595..923bcb0 100644
--- a/core/modules/node/tests/modules/node_access_test/node_access_test.module
+++ b/core/modules/node/tests/modules/node_access_test/node_access_test.module
@@ -83,7 +83,7 @@ function node_access_test_permission() {
 function node_access_test_entity_field_info($entity_type) {
   if ($entity_type === 'node') {
     $info['definitions']['private'] = array(
-      'type' => 'boolean_field',
+      'type' => 'field_item:boolean',
       'label' => t('Private'),
       'computed' => TRUE,
       'list' => TRUE,
diff --git a/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php b/core/modules/path/lib/Drupal/path/Plugin/field/field_type/PathItem.php
similarity index 70%
rename from core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php
rename to core/modules/path/lib/Drupal/path/Plugin/field/field_type/PathItem.php
index 11059b5..e796bd0 100644
--- a/core/modules/path/lib/Drupal/path/Plugin/DataType/PathItem.php
+++ b/core/modules/path/lib/Drupal/path/Plugin/field/field_type/PathItem.php
@@ -2,23 +2,21 @@
 
 /**
  * @file
- * Contains \Drupal\path\Plugin\DataType\PathItem.
+ * Contains \Drupal\path\Plugin\field\field_type\PathItem.
  */
 
-namespace Drupal\path\Plugin\DataType;
+namespace Drupal\path\Plugin\field\field_type;
 
-use Drupal\Core\TypedData\Annotation\DataType;
-use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Entity\Field\FieldItemBase;
 
 /**
- * Defines the 'path_field' entity field item.
+ * Defines the 'path' entity field type.
  *
- * @DataType(
- *   id = "path_field",
- *   label = @Translation("Path field item"),
+ * @FieldType(
+ *   id = "path",
+ *   label = @Translation("Path"),
  *   description = @Translation("An entity field containing a path alias and related data."),
- *   list_class = "\Drupal\Core\Entity\Field\FieldItemList"
+ *   configurable = false
  * )
  */
 class PathItem extends FieldItemBase {
diff --git a/core/modules/path/path.module b/core/modules/path/path.module
index 984650a..f062807 100644
--- a/core/modules/path/path.module
+++ b/core/modules/path/path.module
@@ -216,7 +216,7 @@ function path_form_taxonomy_term_form_alter(&$form, $form_state) {
 function path_entity_field_info($entity_type) {
   if ($entity_type === 'taxonomy_term' || $entity_type === 'node') {
     $info['definitions']['path'] = array(
-      'type' => 'path_field',
+      'type' => 'field_item:path',
       'label' => t('The path alias'),
       'computed' => TRUE,
       'list' => TRUE,
diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
index d0d61fa..1f4b8f0 100644
--- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
@@ -548,7 +548,7 @@ public function testTypedDataValidation() {
     // Test validating property containers and make sure the NotNull and Null
     // constraints work with typed data containers.
     $definition = array(
-      'type' => 'integer_field',
+      'type' => 'field_item:integer',
       'constraints' => array(
         'NotNull' => array(),
       ),
@@ -569,7 +569,7 @@ public function testTypedDataValidation() {
 
     // Test the Null constraint with typed data containers.
     $definition = array(
-      'type' => 'float_field',
+      'type' => 'field_item:float',
       'constraints' => array(
         'Null' => array(),
       ),
@@ -605,7 +605,7 @@ public function testTypedDataValidation() {
     // Test validating a list of a values and make sure property paths starting
     // with "0" are created.
     $definition = array(
-      'type' => 'integer_field',
+      'type' => 'field_item:integer',
       'list' => TRUE,
     );
     $violations = $this->typedData->create($definition, array(array('value' => 10)))->validate();
