diff --git a/components/email.inc b/components/email.inc
index 40b20e5..3717427 100644
--- a/components/email.inc
+++ b/components/email.inc
@@ -33,6 +33,10 @@ function _webform_defaults_email() {
  */
 function _webform_theme_email() {
   return array(
+    'webform_email' => array(
+      'arguments' => array('element' => NULL),
+      'file' => 'components/email.inc',
+    ),
     'webform_display_email' => array(
       'arguments' => array('component' => NULL, 'value' => NULL, 'format' => 'plain'),
       'file' => 'components/email.inc',
@@ -109,7 +113,7 @@ function _webform_edit_email_validate($element, &$form_state) {
 function _webform_render_email($component, $value = NULL, $filter = TRUE) {
   global $user;
   $element = array(
-    '#type' => 'textfield',
+    '#type' => 'webform_email',
     '#title' => $filter ? _webform_filter_xss($component['name']) : $component['name'],
     '#title_display' => $component['extra']['title_display'] ? $component['extra']['title_display'] : 'before',
     '#default_value' => _webform_filter_values($component['value']),
@@ -149,6 +153,29 @@ function _webform_render_email($component, $value = NULL, $filter = TRUE) {
 }
 
 /**
+ * Theme function to render a number component.
+ */
+function theme_webform_email($element) {
+  // This IF statement is mostly in place to allow our tests to set type="text"
+  // because SimpleTest does not support type="number".
+  if (!isset($element['#attributes']['type'])) {
+    $element['#attributes']['type'] = 'email';
+  }
+
+  // Convert properties to attributes on the element if set.
+  foreach (array('id', 'name', 'value', 'size') as $property) {
+    if (isset($element['#' . $property]) && $element['#' . $property] !== '') {
+      $element['#attributes'][$property] = $element['#' . $property];
+    }
+  }
+  _form_set_class($element, array('form-text', 'form-email'));
+
+  $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
+
+  return theme('form_element', $element, $output);
+}
+
+/**
  * A Drupal Form API Validation function. Validates the entered values from
  * email components on the client-side form.
  *
diff --git a/components/number.inc b/components/number.inc
index 5e779a3..9b8596a 100644
--- a/components/number.inc
+++ b/components/number.inc
@@ -260,6 +260,9 @@ function _webform_render_number($component, $value = NULL, $filter = TRUE) {
     '#description' => $filter ? _webform_filter_descriptions($component['extra']['description']) : $component['extra']['description'],
     '#attributes' => $component['extra']['attributes'],
     '#element_validate' => array('_webform_validate_number'),
+    '#theme_wrappers' => array('webform_element_wrapper'),
+    '#pre_render' => array('webform_element_title_display'),
+    '#post_render' => array('webform_element_wrapper'),
     '#min' => $component['extra']['min'],
     '#max' => $component['extra']['max'],
     '#step' => abs($component['extra']['step']),
@@ -302,10 +305,6 @@ function _webform_render_number($component, $value = NULL, $filter = TRUE) {
     if ($component['extra']['type'] == 'select' && $element['#default_value'] === '') {
       $element['#options'] = array('' => ($component['mandatory'] ? t('- Select -') : t('- None -'))) + $element['#options'];
     }
-
-    $element['#theme_wrappers'] = array('webform_element_wrapper');
-    $element['#pre_render'] = array('webform_element_title_display');
-    $element['#post_render'] = array('webform_element_wrapper');
   }
 
   // Set user-entered values.
diff --git a/tests/webform.test b/tests/webform.test
index 21d0535..9a89fc6 100644
--- a/tests/webform.test
+++ b/tests/webform.test
@@ -395,6 +395,10 @@ class WebformTestCase extends DrupalWebTestCase {
           'type' => 'email',
           'value' => '%useremail',
           'mandatory' => '0',
+          'extra' => array(
+            // SimpleTest does not support type="email" input fields.
+            'attributes' => array('type' => 'text'),
+          ),
           'pid' => '0',
           'weight' => '-5',
         ),
diff --git a/webform.module b/webform.module
index bc869cf..2a81252 100644
--- a/webform.module
+++ b/webform.module
@@ -671,12 +671,14 @@ function webform_elements() {
   $elements['webform_time'] = array('#input' => 'TRUE');
   $elements['webform_grid'] = array('#input' => 'TRUE');
 
+  $elements['webform_email'] = array(
+    '#input' => TRUE,
+    '#theme' => 'webform_email',
+    '#size' => 60,
+  );
   $elements['webform_number'] = array(
     '#input' => TRUE,
     '#theme' => 'webform_number',
-    '#theme_wrappers' => array('webform_element_wrapper'),
-    '#pre_render' => array('webform_element_title_display'),
-    '#post_render' => array('webform_element_wrapper'),
     '#min' => NULL,
     '#max' => NULL,
     '#step' => NULL,
