diff --git a/includes/common.inc b/includes/common.inc
index 4ec37dc..526eb6c 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -6558,6 +6558,9 @@ function drupal_common_theme() {
     'textfield' => array(
       'render element' => 'element',
     ),
+    'number' => array(
+      'render element' => 'element',
+    ),
     'form' => array(
       'render element' => 'element',
     ),
diff --git a/includes/form.inc b/includes/form.inc
index 8f2ee26..0d00844 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -3655,6 +3655,39 @@ function theme_textfield($variables) {
 }
 
 /**
+ * Returns HTML for a number form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #description, #size, #maxlength,
+ *     #required, #attributes, #step.
+ *
+ * @ingroup themeable
+ */
+function theme_number($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'number';
+  element_set_attributes($element, array('id', 'name', 'value', 'size', 'maxlength', 'placeholder', 'step'));
+  _form_set_class($element, array('form-text', 'form-number'));
+
+  $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
+
+  return $output . $extra;
+}
+
+/**
+ * Form element validation handler for #type 'number'.
+ *
+ * Note that #maxlength and #required is validated by _form_validate() already.
+ */
+function form_validate_number(&$element, &$form_state) {
+  if ($element['#value'] && !is_numeric($element['#value'])) {
+    form_error($element, t('The number %number is not valid.', array('%number' => $element['#value'])));
+  }
+}
+
+/**
  * Returns HTML for a form.
  *
  * @param $variables
diff --git a/modules/system/system.module b/modules/system/system.module
index 3ebc657..4cd80bb 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -355,6 +355,15 @@ function system_element_info() {
     '#theme' => 'textfield',
     '#theme_wrappers' => array('form_element'),
   );
+  $types['number'] = array(
+    '#input' => TRUE,
+    '#size' => 60,
+    '#maxlength' => 128,
+    '#process' => array('ajax_process_form'),
+    '#element_validate' => array('form_validate_number'),
+    '#theme' => 'number',
+    '#theme_wrappers' => array('form_element'),
+  );
   $types['machine_name'] = array(
     '#input' => TRUE,
     '#default_value' => NULL,
