diff --git a/email.module b/email.module
index a33d85c..02e5fdb 100644
--- a/email.module
+++ b/email.module
@@ -524,3 +524,50 @@ function email_content_migrate_instance_alter(&$instance_value, &$field_value) {
     }
   }
 }
+
+/**
+ * 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',
+    ),
+  );
+}
diff --git a/email.theme.inc b/email.theme.inc
new file mode 100644
index 0000000..5b43849
--- /dev/null
+++ b/email.theme.inc
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * email theme functions.
+ */
+
+/**
+ * Returns HTML for an email field type.
+ */
+function theme_email($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'email';
+  element_set_attributes($element, array('id', 'name', 'value', 'size', 'maxlength', 'placeholder'));
+  _form_set_class($element, array('form-text', 'form-email'));
+
+  $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
+
+  return $output;
+}
