diff --git a/core/lib/Drupal/Core/TypedData/Type/Email.php b/core/lib/Drupal/Core/TypedData/Type/Email.php
new file mode 100644
index 0000000..d0dc5a4
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/Type/Email.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\TypedData\Type\Email.
+ */
+
+namespace Drupal\Core\TypedData\Type;
+
+use Drupal\Core\TypedData\TypedDataInterface;
+
+/**
+ * The Email data type.
+ *
+ * The plain value of Email is the email address represented as PHP string.
+ */
+class Email extends String {
+
+  /**
+   * Implements TypedDataInterface::validate().
+   */
+  public function validate() {
+    // TODO: Implement validate() method.
+  }
+}
diff --git a/core/modules/field/modules/email/email.module b/core/modules/field/modules/email/email.module
index 70d47dd..73e427e 100644
--- a/core/modules/field/modules/email/email.module
+++ b/core/modules/field/modules/email/email.module
@@ -28,6 +28,7 @@ function email_field_info() {
       'description' => t('This field stores an e-mail address in the database.'),
       'default_widget' => 'email_default',
       'default_formatter' => 'email_mailto',
+      'field item class' => 'Drupal\email\Type\EmailItem',
     ),
   );
 }
diff --git a/core/modules/field/modules/email/lib/Drupal/email/Tests/EmailItemTest.php b/core/modules/field/modules/email/lib/Drupal/email/Tests/EmailItemTest.php
new file mode 100644
index 0000000..4fc7e8c
--- /dev/null
+++ b/core/modules/field/modules/email/lib/Drupal/email/Tests/EmailItemTest.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\email\Tests\EmailItemTest.
+ */
+
+namespace Drupal\email\Tests;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\email\Type\EmailItem;
+use Drupal\Core\Entity\Field\FieldItemInterface;
+use Drupal\Core\Entity\Field\FieldInterface;
+
+/**
+ * Tests the new entity API for the email field type.
+ */
+class EmailItemTest extends WebTestBase {
+  public static $modules = array('field', 'field_sql_storage', 'email', 'entity_test', 'options');
+
+  public static function getInfo() {
+    return array(
+      'name'  => 'E-mail field item',
+      'description'  => 'Tests the new entity API for the email field type.',
+      'group' => 'Field types',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    // Create an email field + instance for validation.
+    $this->field = array(
+      'field_name' => 'field_email',
+      'type' => 'email',
+    );
+    field_create_field($this->field);
+    $this->instance = array(
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_email',
+      'bundle' => 'entity_test',
+      'widget' => array(
+        'type' => 'email_default',
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Tests using entity fields of the email field type.
+   */
+  public function testEmailItem() {
+    // Verify entity creation.
+    $entity = entity_create('entity_test', array());
+    $value = 'test@example.com';
+    $entity->field_email = $value;
+    $entity->name->value = $this->randomName();
+    $entity->save();
+
+    // Verify entity has been created properly.
+    $id = $entity->id();
+    $entity = entity_load('entity_test', $id);
+    $this->assertTrue($entity->field_email instanceof FieldInterface, 'Field implements interface.');
+    $this->assertTrue($entity->field_email[0] instanceof FieldItemInterface, 'Field item implements interface.');
+    $this->assertEqual($entity->field_email->value, $value);
+    $this->assertEqual($entity->field_email[0]->value, $value);
+
+    // Verify changing the email value.
+    $new_value = $this->randomName();
+    $entity->field_email->value = $new_value;
+    $this->assertEqual($entity->field_email->value, $new_value);
+
+    // Read changed entity and assert changed values.
+    $entity->save();
+    $entity = entity_load('entity_test', $id);
+    $this->assertEqual($entity->field_email->value, $new_value);
+  }
+}
diff --git a/core/modules/field/modules/email/lib/Drupal/email/Type/EmailItem.php b/core/modules/field/modules/email/lib/Drupal/email/Type/EmailItem.php
new file mode 100644
index 0000000..0b48ad4
--- /dev/null
+++ b/core/modules/field/modules/email/lib/Drupal/email/Type/EmailItem.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\email\Type\EmailItem.
+ */
+
+namespace Drupal\email\Type;
+
+use Drupal\Core\Entity\Field\FieldItemBase;
+
+/**
+ * Defines the 'email_field' entity field item.
+ */
+class EmailItem extends FieldItemBase {
+
+  /**
+   * Property definitions of the contained properties.
+   *
+   * @see self::getPropertyDefinitions()
+   *
+   * @var array
+   */
+  static $propertyDefinitions;
+
+  /**
+   * Implements ComplexDataInterface::getPropertyDefinitions().
+   */
+  public function getPropertyDefinitions() {
+
+    if (!isset(self::$propertyDefinitions)) {
+      self::$propertyDefinitions['value'] = array(
+        'type' => 'email',
+        'label' => t('E-mail value'),
+      );
+    }
+    return self::$propertyDefinitions;
+  }
+}
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 00e4c95..b70329a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
@@ -113,6 +113,17 @@ public function testGetAndSet() {
     $wrapper->setValue(NULL);
     $this->assertNull($wrapper->getValue(), 'URI wrapper is null-able.');
 
+    // Email type.
+    $value = $this->randomString();
+    $wrapper = $this->createTypedData(array('type' => 'email'), $value);
+    $this->assertTrue($wrapper->getValue() === $value, 'E-mail value was fetched.');
+    $new_value = 'test@example.com';
+    $wrapper->setValue($new_value);
+    $this->assertTrue($wrapper->getValue() === $new_value, 'E-mail value was changed.');
+    $this->assertTrue(is_string($wrapper->getString()), 'E-mail value was converted to string');
+    $wrapper->setValue(NULL);
+    $this->assertNull($wrapper->getValue(), 'E-mail wrapper is null-able.');
+
     // Binary type.
     $wrapper = $this->createTypedData(array('type' => 'binary'), $files[0]->uri);
     $this->assertTrue(is_resource($wrapper->getValue()), 'Binary value was fetched.');
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 843ed78..35dfa37 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2057,6 +2057,11 @@ function system_data_type_info() {
       'class' => '\Drupal\Core\TypedData\Type\Uri',
       'primitive type' => Primitive::URI,
     ),
+    'email' => array(
+      'label' => t('Email'),
+      'class' => '\Drupal\Core\TypedData\Type\Email',
+      'primitive type' => Primitive::STRING,
+    ),
     'binary' => array(
       'label' => t('Binary'),
       'class' => '\Drupal\Core\TypedData\Type\Binary',
