diff --git a/email.module b/email.module
index a33d85c..f9234f7 100644
--- a/email.module
+++ b/email.module
@@ -147,15 +147,24 @@ function email_field_formatter_view($object_type, $object, $field, $instance, $l
  */
 function email_field_widget_info() {
   return array(
-    'email_textfield' => array(
-      'label' => t('Text field'),
+    'email_emailfield' => array(
+      'label' => t('Email'),
       'field types' => array('email'),
       'settings' => array('size' => 60),
     ),
+
   );
 }
 
 /**
+ * Implements hook_field_widget_info_alter().
+ */
+function email_field_widget_info_alter(&$info) {
+  // Ensure backwards compatibility of widget types
+  $info['text_textfield']['field types'][] = 'email';
+}
+
+/**
  * Implements hook_field_widget_settings_form().
  */
 function email_field_widget_settings_form($field, $instance) {
@@ -178,7 +187,7 @@ function email_field_widget_settings_form($field, $instance) {
 function email_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) {
   $element = $base;
   $element['email'] = $base + array(
-    '#type' => 'textfield',
+    '#type' => 'email',
     '#default_value' => isset($items[$delta]['email']) ? $items[$delta]['email'] : NULL,
     '#size' => $instance['widget']['settings']['size'],
     '#prefix' => '<div class="text-full-wrapper">',
@@ -518,9 +527,57 @@ function email_admin_settings() {
 function email_content_migrate_instance_alter(&$instance_value, &$field_value) {
   if ($field_value['module'] == 'email') {
     foreach ($instance_value['display'] as $context => $settings) {
-      if (in_array($instance_value['display'][$context]['type'], array('default', 'plain', 'contact', 'spamspan'))) {
+      if (in_array(
+        $instance_value['display'][$context]['type'],
+        array('default', 'plain', 'contact', 'spamspan')
+      )) {
         $instance_value['display'][$context]['type'] = 'email_' . $instance_value['display'][$context]['type'];
       }
     }
   }
 }
+
+/**
+ * Implements hook_element_info().
+ */
+function email_element_info() {
+  $types = array();
+
+  $types['email'] = array(
+    '#input' => TRUE,
+    '#size' => 60,
+    '#maxlength' => 254,
+    '#autocomplete_path' => FALSE,
+    '#process' => array('ajax_process_form'),
+    '#element_validate' => array('email_validate_email'),
+    '#theme' => 'email',
+    '#theme_wrappers' => array('form_element'),
+  );
+
+  return $types;
+}
+
+/**
+ * Form element validation handler for #type 'email'.
+ */
+function email_validate_email(&$element, &$form_state) {
+  $value = trim($element['#value']);
+  form_set_value($element, $value, $form_state);
+
+  if ($value !== '' && !valid_email_address($value)) {
+    form_error($element, t('The email address %mail is not valid.', array('%mail' => $value)));
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function email_theme() {
+  return array(
+    'email' => array(
+      'arguments' => array('element' => NULL),
+      'render element' => 'element',
+      'file' => 'email.theme.inc',
+    ),
+  );
+}
