diff --git a/includes/form.inc b/includes/form.inc
index 8c3b14a..b11d610 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -2560,8 +2560,8 @@ function form_process_select($element) {
  */
 function theme_select($variables) {
   $element = $variables['element'];
+  $element['#attributes']['type'] = 'select';
   element_set_attributes($element, array('id', 'name', 'size'));
-  _form_set_class($element, array('form-select'));
 
   return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
 }
@@ -2673,8 +2673,11 @@ function form_get_options($element, $key) {
  */
 function theme_fieldset($variables) {
   $element = $variables['element'];
+
+  // The .form-wrapper class is required for #states to treat fieldsets like
+  // containers.
+  $element['#attributes']['class'][] = 'form-wrapper';
   element_set_attributes($element, array('id'));
-  _form_set_class($element, array('form-wrapper'));
 
   $output = '<fieldset' . drupal_attributes($element['#attributes']) . '>';
   if (!empty($element['#title'])) {
@@ -2716,7 +2719,6 @@ function theme_radio($variables) {
   if (isset($element['#return_value']) && $element['#value'] !== FALSE && $element['#value'] == $element['#return_value']) {
     $element['#attributes']['checked'] = 'checked';
   }
-  _form_set_class($element, array('form-radio'));
 
   return '<input' . drupal_attributes($element['#attributes']) . ' />';
 }
@@ -2978,7 +2980,6 @@ function theme_checkbox($variables) {
   if (!empty($element['#checked'])) {
     $element['#attributes']['checked'] = 'checked';
   }
-  _form_set_class($element, array('form-checkbox'));
 
   return '<input' . drupal_attributes($element['#attributes']) . ' />';
 }
@@ -3614,7 +3615,6 @@ function theme_button($variables) {
   $element['#attributes']['type'] = 'submit';
   element_set_attributes($element, array('id', 'name', 'value'));
 
-  $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
   if (!empty($element['#attributes']['disabled'])) {
     $element['#attributes']['class'][] = 'form-button-disabled';
   }
@@ -3683,7 +3683,6 @@ function theme_textfield($variables) {
   $element = $variables['element'];
   $element['#attributes']['type'] = 'text';
   element_set_attributes($element, array('id', 'name', 'value', 'size', 'maxlength', 'placeholder'));
-  _form_set_class($element, array('form-text'));
 
   $extra = '';
   if ($element['#autocomplete_path'] && drupal_valid_path($element['#autocomplete_path'])) {
@@ -3741,7 +3740,6 @@ function theme_form($variables) {
 function theme_textarea($variables) {
   $element = $variables['element'];
   element_set_attributes($element, array('id', 'name', 'rows', 'cols', 'placeholder'));
-  _form_set_class($element, array('form-textarea'));
 
   $wrapper_attributes = array(
     'class' => array('form-textarea-wrapper'),
@@ -3774,7 +3772,6 @@ function theme_password($variables) {
   $element = $variables['element'];
   $element['#attributes']['type'] = 'password';
   element_set_attributes($element, array('id', 'name', 'size', 'maxlength', 'placeholder'));
-  _form_set_class($element, array('form-text'));
 
   return '<input' . drupal_attributes($element['#attributes']) . ' />';
 }
@@ -3811,7 +3808,6 @@ function theme_file($variables) {
   $element = $variables['element'];
   $element['#attributes']['type'] = 'file';
   element_set_attributes($element, array('id', 'name', 'size'));
-  _form_set_class($element, array('form-file'));
 
   return '<input' . drupal_attributes($element['#attributes']) . ' />';
 }
@@ -3826,6 +3822,8 @@ function theme_file($variables) {
  * - form-item-#name: The internal form element #name (usually derived from the
  *   $form structure and set via form_builder()).
  * - form-disabled: Only set if the form element is #disabled.
+ * - form-required: Only set if the form element is #required.
+ * - form-error: Only set if the form element contains an error.
  *
  * In addition to the element itself, the DIV contains a label for the element
  * based on the optional #title_display property, and an optional #description.
@@ -3889,6 +3887,15 @@ function theme_form_element($variables) {
   if (!empty($element['#attributes']['disabled'])) {
     $attributes['class'][] = 'form-disabled';
   }
+  // Add a class indicating that the form element is required.
+  if (!empty($element['#required'])) {
+    $attributes['class'][] = 'form-required';
+  }
+  // Add a class indicating that the form element contains an error.
+  if (isset($element['#parents']) && form_get_error($element)) {
+    $attributes['class'][] = 'form-error';
+  }
+
   $output = '<div' . drupal_attributes($attributes) . '>' . "\n";
 
   // If #title is not set, we don't display any label or required marker.
@@ -3939,7 +3946,7 @@ function theme_form_required_marker($variables) {
   // This is also used in the installer, pre-database setup.
   $t = get_t();
   $attributes = array(
-    'class' => 'form-required',
+    'class' => 'form-required-marker',
     'title' => $t('This field is required.'),
   );
   return '<abbr' . drupal_attributes($attributes) . '>*</abbr>';
@@ -4001,34 +4008,6 @@ function theme_form_element_label($variables) {
 }
 
 /**
- * Sets a form element's class attribute.
- *
- * Adds 'required' and 'error' classes as needed.
- *
- * @param $element
- *   The form element.
- * @param $name
- *   Array of new class names to be added.
- */
-function _form_set_class(&$element, $class = array()) {
-  if (!empty($class)) {
-    if (!isset($element['#attributes']['class'])) {
-      $element['#attributes']['class'] = array();
-    }
-    $element['#attributes']['class'] = array_merge($element['#attributes']['class'], $class);
-  }
-  // This function is invoked from form element theme functions, but the
-  // rendered form element may not necessarily have been processed by
-  // form_builder().
-  if (!empty($element['#required'])) {
-    $element['#attributes']['class'][] = 'required';
-  }
-  if (isset($element['#parents']) && form_get_error($element)) {
-    $element['#attributes']['class'][] = 'error';
-  }
-}
-
-/**
  * Helper form element validator: integer.
  */
 function element_validate_integer($element, &$form_state) {
diff --git a/misc/states.js b/misc/states.js
index 0b2616b..54182f6 100644
--- a/misc/states.js
+++ b/misc/states.js
@@ -360,7 +360,7 @@ states.State.prototype = {
       $(e.target)
         .attr('disabled', e.value)
         .filter('.form-element')
-          .closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'addClass' : 'removeClass']('form-disabled');
+          .closest('.form-item, input[type=submit], .form-wrapper')[e.value ? 'addClass' : 'removeClass']('form-disabled');
 
       // Note: WebKit nightlies don't reflect that change correctly.
       // See https://bugs.webkit.org/show_bug.cgi?id=23789
@@ -370,17 +370,17 @@ states.State.prototype = {
   $(document).bind('state:required', function(e) {
     if (e.trigger) {
       if (e.value) {
-        $(e.target).closest('.form-item, .form-wrapper').find('label').append('<abbr class="form-required" title="' + Drupal.t('This field is required.') + '">*</abbr>');
+        $(e.target).closest('.form-item, .form-wrapper').find('label').append('<abbr class="form-required-marker" title="' + Drupal.t('This field is required.') + '">*</abbr>');
       }
       else {
-        $(e.target).closest('.form-item, .form-wrapper').find('label .form-required').remove();
+        $(e.target).closest('.form-item, .form-wrapper').find('label .form-required-marker').remove();
       }
     }
   });
 
   $(document).bind('state:visible', function(e) {
     if (e.trigger) {
-      $(e.target).closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'show' : 'hide']();
+      $(e.target).closest('.form-item, input[type=submit], .form-wrapper')[e.value ? 'show' : 'hide']();
     }
   });
 
diff --git a/misc/tableselect.js b/misc/tableselect.js
index 1abda24..7e58227 100644
--- a/misc/tableselect.js
+++ b/misc/tableselect.js
@@ -23,7 +23,7 @@ Drupal.tableSelect = function () {
   };
 
   // Find all <th> with class select-all, and insert the check all checkbox.
-  $('th.select-all', table).prepend($('<input type="checkbox" class="form-checkbox" />').attr('title', strings.selectAll)).click(function (event) {
+  $('th.select-all', table).prepend($('<input type="checkbox" />').attr('title', strings.selectAll)).click(function (event) {
     if ($(event.target).is('input:checkbox')) {
       // Loop through all checkboxes and set their state to the select all checkbox' state.
       checkboxes.each(function () {
diff --git a/modules/color/color.admin-rtl.css b/modules/color/color.admin-rtl.css
index bfbcd49..28aac72 100644
--- a/modules/color/color.admin-rtl.css
+++ b/modules/color/color.admin-rtl.css
@@ -13,11 +13,11 @@
   float: right;
   clear: right;
 }
-.color-form .form-text,
-.color-form .form-select {
+.color-form input[type=text],
+.color-form select {
   float: right;
 }
-.color-form .form-text {
+.color-form input[type=text] {
   margin-right: 0;
   margin-left: 5px;
 }
diff --git a/modules/color/color.admin.css b/modules/color/color.admin.css
index e513dad..97f76b3 100644
--- a/modules/color/color.admin.css
+++ b/modules/color/color.admin.css
@@ -22,11 +22,11 @@
   clear: left; /* LTR */
   width: 10em;
 }
-.color-form .form-text,
-.color-form .form-select {
+.color-form input[type=text],
+.color-form select {
   float: left; /* LTR */
 }
-.color-form .form-text {
+.color-form input[type=text] {
   text-align: center;
   margin-right: 5px; /* LTR */
   cursor: pointer;
diff --git a/modules/color/color.js b/modules/color/color.js
index 3e53ce1..cf71e13 100644
--- a/modules/color/color.js
+++ b/modules/color/color.js
@@ -176,7 +176,7 @@ Drupal.behaviors.color = {
     }
 
     // Initialize color fields.
-    $('#palette input.form-text', form)
+    $('#palette input[type=text]', form)
     .each(function () {
       // Extract palette field name
       this.key = this.id.substring(13);
diff --git a/modules/dblog/dblog.css b/modules/dblog/dblog.css
index 88f4ba0..a094edc 100644
--- a/modules/dblog/dblog.css
+++ b/modules/dblog/dblog.css
@@ -10,7 +10,7 @@
    */
   width: 15em;
 }
-#dblog-filter-form .form-type-select select {
+#dblog-filter-form select {
   width: 100%;
 }
 #dblog-filter-form .form-actions {
diff --git a/modules/field/tests/field.test b/modules/field/tests/field.test
index 99eeb8a..9746527 100644
--- a/modules/field/tests/field.test
+++ b/modules/field/tests/field.test
@@ -1671,6 +1671,7 @@ class FieldFormTestCase extends FieldTestCase {
     );
     $this->drupalPost('test-entity/nested/1/2', $edit, t('Save'));
     $this->assertRaw(t('%label does not accept the value -1', array('%label' => 'Unlimited field')), t('Entity 1: the field validation error was reported.'));
+    // HELP! Needs to check for .form-error class on the wrapper of this element.
     $error_field = $this->xpath('//input[@id=:id and contains(@class, "error")]', array(':id' => 'edit-field-unlimited-und-1-value'));
     $this->assertTrue($error_field, t('Entity 1: the error was flagged on the correct element.'));
     $edit = array(
@@ -1678,6 +1679,7 @@ class FieldFormTestCase extends FieldTestCase {
     );
     $this->drupalPost('test-entity/nested/1/2', $edit, t('Save'));
     $this->assertRaw(t('%label does not accept the value -1', array('%label' => 'Unlimited field')), t('Entity 2: the field validation error was reported.'));
+    // HELP! Needs to check for .form-error class on the wrapper of this element.
     $error_field = $this->xpath('//input[@id=:id and contains(@class, "error")]', array(':id' => 'edit-entity-2-field-unlimited-und-1-value'));
     $this->assertTrue($error_field, t('Entity 2: the error was flagged on the correct element.'));
 
diff --git a/modules/file/file.css b/modules/file/file.css
index aed1a9d..a6a9ff6 100644
--- a/modules/file/file.css
+++ b/modules/file/file.css
@@ -2,8 +2,8 @@
 /**
  * Managed file element styles.
  */
-.form-managed-file .form-file,
-.form-managed-file .form-submit {
+.form-managed-file input[type=file],
+.form-managed-file input[type=submit] {
   margin: 0;
 }
 
diff --git a/modules/file/file.js b/modules/file/file.js
index 1071384..9d39bab 100644
--- a/modules/file/file.js
+++ b/modules/file/file.js
@@ -36,12 +36,12 @@ Drupal.behaviors.fileValidateAutoAttach = {
  */
 Drupal.behaviors.fileButtons = {
   attach: function (context) {
-    $('input.form-submit', context).bind('mousedown', Drupal.file.disableFields);
-    $('div.form-managed-file input.form-submit', context).bind('mousedown', Drupal.file.progressBar);
+    $('input[type=submit]', context).bind('mousedown', Drupal.file.disableFields);
+    $('div.form-managed-file input[type=submit]', context).bind('mousedown', Drupal.file.progressBar);
   },
   detach: function (context) {
-    $('input.form-submit', context).unbind('mousedown', Drupal.file.disableFields);
-    $('div.form-managed-file input.form-submit', context).unbind('mousedown', Drupal.file.progressBar);
+    $('input[type=submit]', context).unbind('mousedown', Drupal.file.disableFields);
+    $('div.form-managed-file input[type=submit]', context).unbind('mousedown', Drupal.file.progressBar);
   }
 };
 
@@ -97,7 +97,7 @@ Drupal.file = Drupal.file || {
     // Check if we're working with an "Upload" button.
     var $enabledFields = [];
     if ($(this).parents('div.form-managed-file').size() > 0) {
-      $enabledFields = $(this).parents('div.form-managed-file').find('input.form-file');
+      $enabledFields = $(this).parents('div.form-managed-file').find('input[type=file]');
     }
 
     // Temporarily disable upload fields other than the one we're currently
@@ -108,7 +108,7 @@ Drupal.file = Drupal.file || {
     // behaviors) are excuted before any timeout functions are called, so we
     // don't have to worry about the fields being re-enabled too soon.
     // @todo If the previous sentence is true, why not set the timeout to 0?
-    var $fieldsToTemporarilyDisable = $('div.form-managed-file input.form-file').not($enabledFields).not(':disabled');
+    var $fieldsToTemporarilyDisable = $('div.form-managed-file input[type=file]').not($enabledFields).not(':disabled');
     $fieldsToTemporarilyDisable.attr('disabled', 'disabled');
     setTimeout(function (){
       $fieldsToTemporarilyDisable.attr('disabled', '');
diff --git a/modules/filter/filter.admin.js b/modules/filter/filter.admin.js
index 3bc6233..194a78b 100644
--- a/modules/filter/filter.admin.js
+++ b/modules/filter/filter.admin.js
@@ -2,7 +2,7 @@
 
 Drupal.behaviors.filterStatus = {
   attach: function (context, settings) {
-    $('#filters-status-wrapper input.form-checkbox', context).once('filter-status', function () {
+    $('#filters-status-wrapper input[type=checkbox]', context).once('filter-status', function () {
       var $checkbox = $(this);
       // Retrieve the tabledrag row belonging to this filter.
       var $row = $('#' + $checkbox.attr('id').replace(/-status$/, '-weight'), context).closest('tr');
diff --git a/modules/locale/locale.test b/modules/locale/locale.test
index 82e7694..f5d55fe 100644
--- a/modules/locale/locale.test
+++ b/modules/locale/locale.test
@@ -487,6 +487,7 @@ class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
       );
       $this->drupalPost($path, $edit, t('Save translations'));
       // Check for a form error on the textarea.
+      // HELP! Needs to check for .form-error class on the wrapper of this element.
       $form_class = $this->xpath('//form[@id="locale-translate-edit-form"]//textarea/@class');
       $this->assertNotIdentical(FALSE, strpos($form_class[0], 'error'), t('The string was rejected as unsafe.'));
       $this->assertNoText(t('The string has been saved.'), t('The string was not saved.'));
diff --git a/modules/poll/poll.css b/modules/poll/poll.css
index 8b04e38..b6fe8c5 100644
--- a/modules/poll/poll.css
+++ b/modules/poll/poll.css
@@ -35,7 +35,7 @@
 .node-form #edit-poll-more {
   margin: 0;
 }
-.node-form #poll-choice-table .form-text {
+.node-form #poll-choice-table input[type=text] {
   display: inline;
   width: auto;
 }
@@ -46,6 +46,6 @@
 td.poll-chtext {
   width: 80%;
 }
-td.poll-chvotes .form-text {
+td.poll-chvotes input[type=text] {
   width: 85%;
 }
diff --git a/modules/simpletest/simpletest.js b/modules/simpletest/simpletest.js
index c33ef98..936d9db 100644
--- a/modules/simpletest/simpletest.js
+++ b/modules/simpletest/simpletest.js
@@ -62,7 +62,7 @@ Drupal.behaviors.simpleTestSelectAll = {
   attach: function (context, settings) {
     $('td.simpletest-select-all').each(function () {
       var testCheckboxes = settings.simpleTest['simpletest-test-group-' + $(this).attr('id')].testNames;
-      var groupCheckbox = $('<input type="checkbox" class="form-checkbox" id="' + $(this).attr('id') + '-select-all" />');
+      var groupCheckbox = $('<input type="checkbox" id="' + $(this).attr('id') + '-select-all" />');
 
       // Each time a single-test checkbox is checked or unchecked, make sure
       // that the associated group checkbox gets the right state too.
diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test
index 386880e..0091490 100644
--- a/modules/simpletest/tests/form.test
+++ b/modules/simpletest/tests/form.test
@@ -65,7 +65,7 @@ class FormsTestCase extends DrupalWebTestCase {
     $elements['file']['empty_values'] = $empty_strings;
 
     // Regular expression to find the expected marker on required elements.
-    $required_marker_preg = '@<label.*<abbr class="form-required" title="This field is required\.">\*</abbr></label>@';
+    $required_marker_preg = '@<label.*<abbr class="form-required-marker" title="This field is required\.">\*</abbr></label>@';
 
     // Go through all the elements and all the empty values for them.
     foreach ($elements as $type => $data) {
@@ -622,16 +622,16 @@ class FormsElementsLabelsTestCase extends DrupalWebTestCase {
 
     // Exercise various defaults for textboxes and modifications to ensure
     // appropriate override and correct behaviour.
-    $elements = $this->xpath('//label[@for="edit-form-textfield-test-title-and-required"]/child::abbr[@class="form-required"]/parent::*/following-sibling::input[@id="edit-form-textfield-test-title-and-required"]');
+    $elements = $this->xpath('//label[@for="edit-form-textfield-test-title-and-required"]/child::abbr[@class="form-required-marker"]/parent::*/following-sibling::input[@id="edit-form-textfield-test-title-and-required"]');
     $this->assertTrue(isset($elements[0]), t("Label precedes textfield, with required marker inside label."));
 
-    $elements = $this->xpath('//input[@id="edit-form-textfield-test-no-title-required"]/preceding-sibling::label[@for="edit-form-textfield-test-no-title-required"]/abbr[@class="form-required"]');
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-no-title-required"]/preceding-sibling::label[@for="edit-form-textfield-test-no-title-required"]/abbr[@class="form-required-marker"]');
     $this->assertTrue(isset($elements[0]), t("Label tag with required marker precedes required textfield with no title."));
 
     $elements = $this->xpath('//input[@id="edit-form-textfield-test-title-invisible"]/preceding-sibling::label[@for="edit-form-textfield-test-title-invisible" and @class="element-invisible"]');
     $this->assertTrue(isset($elements[0]), t("Label preceding field and label class is element-invisible."));
 
-    $elements = $this->xpath('//input[@id="edit-form-textfield-test-title"]/preceding-sibling::abbr[@class="form-required"]');
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-title"]/preceding-sibling::abbr[@class="form-required-marker"]');
     $this->assertFalse(isset($elements[0]), t("No required marker on non-required field."));
 
     $elements = $this->xpath('//input[@id="edit-form-textfield-test-title-after"]/following-sibling::label[@for="edit-form-textfield-test-title-after" and @class="option"]');
diff --git a/modules/system/system.admin.css b/modules/system/system.admin.css
index 7299484..b9184b4 100644
--- a/modules/system/system.admin.css
+++ b/modules/system/system.admin.css
@@ -253,7 +253,7 @@ table.screenshot {
   font-weight: normal;
   width: 10em;
 }
-.exposed-filters .form-select {
+.exposed-filters select {
   width: 14em;
 }
 /* Current filters */
diff --git a/modules/system/system.theme.css b/modules/system/system.theme.css
index f34a965..27e9a1b 100644
--- a/modules/system/system.theme.css
+++ b/modules/system/system.theme.css
@@ -101,15 +101,16 @@ input.form-radio {
   vertical-align: middle;
 }
 .marker,
-.form-required {
+.form-required-marker {
   color: #f00;
 }
-abbr.form-required, abbr.tabledrag-changed, abbr.ajax-changed {
+abbr.form-required-marker, abbr.tabledrag-changed, abbr.ajax-changed {
   border-bottom: none;
 }
-.form-item input.error,
-.form-item textarea.error,
-.form-item select.error {
+.form-error input[type=text],
+.form-error input[type=password],
+.form-error textarea,
+.form-error select {
   border: 2px solid red;
 }
 
diff --git a/themes/bartik/css/ie.css b/themes/bartik/css/ie.css
index 7a65833..3e24f1a 100644
--- a/themes/bartik/css/ie.css
+++ b/themes/bartik/css/ie.css
@@ -22,21 +22,21 @@ fieldset legend {
   display: inline-block;
   width: auto;
 }
-#search-block-form input.form-submit,
-#search-form input.form-submit {
+#search-block-form input[type=submit],
+#search-form input[type=submit] {
   text-transform: capitalize; /* Trigger text indent. */
   height: 26px;
 }
 .meta {
   margin-bottom: 10px;
 }
-.region-header .form-required {
+.region-header .form-required-marker {
   color: #eee;
 }
-#search-block-form input.form-submit:hover,
-#search-block-form input.form-submit:focus,
-#search-form input.form-submit:hover,
-#search-form input.form-submit:focus {
+#search-block-form input[type=submit]:hover,
+#search-block-form input[type=submit]:focus,
+#search-form input[type=submit]:hover,
+#search-form input[type=submit]:focus {
   background-position: center -25px;
 }
 .contact-form #edit-message {
diff --git a/themes/bartik/css/style-rtl.css b/themes/bartik/css/style-rtl.css
index d25006f..c028101 100644
--- a/themes/bartik/css/style-rtl.css
+++ b/themes/bartik/css/style-rtl.css
@@ -49,7 +49,8 @@ ul.tips {
 #name-and-slogan {
   margin: 0 15px 30px 0;
 }
-.region-header .form-text {
+.region-header input[type=text],
+.region-header input[type=password] {
   margin-left: 2px;
   margin-right: 0;
 }
@@ -144,7 +145,7 @@ ul.tips {
 
 /* ----------------- Buttons ------------------ */
 
-input.form-submit,
+input[type=submit],
 a.button {
   margin-right: 0;
   margin-left: 0.6em;
diff --git a/themes/bartik/css/style.css b/themes/bartik/css/style.css
index 4fb8210..5e0e0ab 100644
--- a/themes/bartik/css/style.css
+++ b/themes/bartik/css/style.css
@@ -338,7 +338,8 @@ h1#site-name {
   list-style-image: none;
   padding: 0;
 }
-.region-header .form-text {
+.region-header input[type=text],
+.region-header input[type=password] {
   background: #fefefe;
   background: rgba(255, 255, 255, 0.7);
   border-color: #ccc;
@@ -346,13 +347,16 @@ h1#site-name {
   margin-right: 2px; /* LTR */
   width: 120px;
 }
-.region-header .form-text:hover,
-.region-header .form-text:focus,
-.region-header .form-text:active {
+.region-header input[type=text]:hover,
+.region-header input[type=text]:focus,
+.region-header input[type=text]:active,
+.region-header input[type=password]:hover,
+.region-header input[type=password]:focus,
+.region-header input[type=password]:active {
   background: #fff;
   background: rgba(255, 255, 255, 0.8);
 }
-.region-header .form-required {
+.region-header .form-required-marker {
   color: #eee;
   color: rgba(255, 255, 255, 0.7);
 }
@@ -427,7 +431,7 @@ h1#site-name {
   padding: 0;
   clear: both;
 }
-.region-header #block-user-login input.form-submit {
+.region-header #block-user-login input[type=submit] {
   border: 1px solid;
   border-color: #ccc;
   border-color: rgba(255, 255, 255, 0.5);
@@ -436,8 +440,8 @@ h1#site-name {
   margin: 4px 0;
   padding: 3px 8px;
 }
-.region-header #block-user-login input.form-submit:hover,
-.region-header #block-user-login input.form-submit:focus {
+.region-header #block-user-login input[type=submit]:hover,
+.region-header #block-user-login input[type=submit]:focus {
   background: #fff;
   background: rgba(255, 255, 255, 0.9);
 }
@@ -445,7 +449,7 @@ h1#site-name {
 .region-header #block-search-form {
   width: 208px;
 }
-.region-header #block-search-form .form-text {
+.region-header #block-search-form input[type=text] {
   width: 154px;
 }
 /* Language switcher block in region header. */
@@ -808,7 +812,8 @@ ul.links {
 #triptych .block ol {
   padding-left: 0;
 }
-#triptych #block-user-login .form-text {
+#triptych #block-user-login input[type=text],
+#triptych #block-user-login input[type=password] {
   width: 185px;
 }
 #triptych #block-user-online p {
@@ -1085,7 +1090,7 @@ div.password-confirm {
 
 /* ---------------- Buttons    ---------------- */
 
-input.form-submit,
+input[type=submit],
 a.button {
   background: #fff url(../images/buttons.png) 0 0 repeat-x;
   border: 1px solid #e4e4e4;
@@ -1227,17 +1232,18 @@ textarea {
 textarea {
   line-height: 1.5;
 }
-textarea.form-textarea,
-select.form-select {
+textarea,
+select {
   padding: 4px;
 }
-input.form-text,
-textarea.form-textarea,
-select.form-select {
+input[type=text],
+input[type=password],
+textarea,
+select {
   border: 1px solid #ccc;
 }
-input.form-submit:hover,
-input.form-submit:focus {
+input[type=submit]:hover,
+input[type=submit]:focus {
   background: #dedede;
 }
 .password-suggestions ul li {
@@ -1341,7 +1347,7 @@ html.js input.throbbing {
   width: 120px;
 }
 .comment-form input,
-.comment-form .form-select {
+.comment-form select {
   margin: 0;
   -khtml-border-radius: 4px;
   -moz-border-radius: 4px;
@@ -1354,7 +1360,7 @@ html.js input.throbbing {
 .comment-form .form-item,
 .comment-form .form-radios,
 .comment-form .form-type-checkbox,
-.comment-form .form-select {
+.comment-form select {
   margin-bottom: 10px;
   overflow: hidden;
 }
@@ -1367,16 +1373,16 @@ html.js input.throbbing {
   float: none;
   margin-top: 0;
 }
-.comment-form input.form-file {
+.comment-form input[type=file] {
   width: auto;
 }
-.no-sidebars .comment-form .form-text {
+.no-sidebars .comment-form input[type=text] {
   width: 800px;
 }
-.one-sidebar .comment-form .form-text {
+.one-sidebar .comment-form input[type=text] {
   width: 500px;
 }
-.two-sidebars .comment-form .form-text {
+.two-sidebars .comment-form input[type=text] {
   width: 320px;
 }
 .comment-form .form-item .description {
@@ -1387,7 +1393,7 @@ html.js input.throbbing {
 #content h2.comment-form {
   margin-bottom: 0.5em;
 }
-.comment-form .form-textarea {
+.comment-form textarea {
   -khtml-border-radius-topleft: 4px;
   -khtml-border-radius-topright: 4px;
   -moz-border-radius-topleft: 4px;
@@ -1406,7 +1412,7 @@ html.js input.throbbing {
   width: auto;
   float: none;
 }
-.filter-wrapper .form-select {
+.filter-wrapper select {
   min-width: 120px;
 }
 .comment-form fieldset.filter-wrapper .tips {
@@ -1454,8 +1460,8 @@ div.vertical-tabs .vertical-tabs-panes fieldset.vertical-tabs-pane {
   margin-right: 5px;
   width: 9em;
 }
-#search-block-form input.form-submit,
-#search-form input.form-submit {
+#search-block-form input[type=submit],
+#search-form input[type=submit] {
   margin-left: 0;
   margin-right: 0;
   height: 25px;
@@ -1467,10 +1473,10 @@ div.vertical-tabs .vertical-tabs-panes fieldset.vertical-tabs-pane {
   background: url(../images/search-button.png) no-repeat center top;
   overflow: hidden;
 }
-#search-block-form input.form-submit:hover,
-#search-block-form input.form-submit:focus,
-#search-form input.form-submit:hover,
-#search-form input.form-submit:focus {
+#search-block-form input[type=submit]:hover,
+#search-block-form input[type=submit]:focus,
+#search-form input[type=submit]:hover,
+#search-form input[type=submit]:focus {
   background-position: center bottom;
 }
 #search-form .form-item-keys label {
diff --git a/themes/seven/reset.css b/themes/seven/reset.css
index 306b1f9..ea48f84 100644
--- a/themes/seven/reset.css
+++ b/themes/seven/reset.css
@@ -103,7 +103,7 @@ tr.even .form-item,
 .form-checkboxes .form-item,
 .form-radios .form-item,
 .marker,
-.form-required,
+.form-required-marker,
 .more-link,
 .more-help-link,
 .item-list .pager,
diff --git a/themes/seven/style-rtl.css b/themes/seven/style-rtl.css
index a41d325..595f8c2 100644
--- a/themes/seven/style-rtl.css
+++ b/themes/seven/style-rtl.css
@@ -43,7 +43,7 @@ ol {
 #branding div.block form div.form-item {
   float: right;
 }
-#branding div.block form input.form-text {
+#branding div.block form input[type=text] {
   margin-left: 10px;
   margin-right: 0;
 }
@@ -161,7 +161,7 @@ body div.form-type-checkbox div.description {
   margin-left: 0;
   margin-right: 1.5em;
 }
-input.form-submit,
+input[type=submit],
 a.button {
   margin-left: 1em;
   margin-right: 0;
diff --git a/themes/seven/style.css b/themes/seven/style.css
index d9ca419..6928496 100644
--- a/themes/seven/style.css
+++ b/themes/seven/style.css
@@ -204,11 +204,11 @@ pre {
   margin: 0;
   padding: 0;
 }
-#branding div.block form input.form-text {
+#branding div.block form input[type=text] {
   width: 140px;
   margin-right: 10px; /* LTR */
 }
-#branding div.block form input.form-submit {
+#branding div.block form input[type=submit] {
   text-align: center;
   width: 80px;
 }
@@ -605,10 +605,11 @@ div.teaser-checkbox .form-item,
   vertical-align: middle;
 }
 .form-disabled input.form-autocomplete,
-.form-disabled input.form-text,
-.form-disabled input.form-file,
-.form-disabled textarea.form-textarea,
-.form-disabled select.form-select {
+.form-disabled input[type=text],
+.form-disabled input[type=password],
+.form-disabled input[type=file],
+.form-disabled textarea,
+.form-disabled select {
   background-color: #eee;
   color: #777;
 }
@@ -642,7 +643,7 @@ body div.form-type-radio div.description,
 body div.form-type-checkbox div.description {
   margin-left: 1.5em; /* LTR */
 }
-input.form-submit,
+input[type=submit],
 a.button {
   cursor: pointer;
   padding: 4px 17px;
@@ -678,7 +679,7 @@ a.button:active {
   background: url(images/buttons.png) 0 -40px repeat-x;
   color: #133B54;
 }
-input.form-submit:active {
+input[type=submit]:active {
   background: #666;
   color: #fff;
   border-color: #555;
@@ -692,20 +693,22 @@ input.form-button-disabled:active {
   color: #999;
 }
 input.form-autocomplete,
-input.form-text,
-input.form-file,
-textarea.form-textarea,
-select.form-select {
+input[type=text],
+input[type=password],
+input[type=file],
+textarea,
+select {
   padding: 2px;
   border: 1px solid #ccc;
   border-top-color: #999;
   background: #fff;
   color: #333;
 }
-input.form-text:focus,
-input.form-file:focus,
-textarea.form-textarea:focus,
-select.form-select:focus {
+input[type=text]:focus,
+input[type=password]:focus,
+input[type=file]:focus,
+textarea:focus,
+select:focus {
   color: #000;
   border-color: #ace;
 }
@@ -836,7 +839,7 @@ body.in-maintenance div.form-item:after {
   display: none;
   clear: none;
 }
-body.in-maintenance .form-submit {
+body.in-maintenance input[type=submit] {
   display: block;
 }
 body.in-maintenance #logo {
@@ -946,7 +949,7 @@ div.add-or-remove-shortcuts {
 #field-display-overview .field-formatter-settings-edit-form .form-item {
   margin: 10px 0;
 }
-#field-display-overview .field-formatter-settings-edit-form .form-submit {
+#field-display-overview .field-formatter-settings-edit-form input[type=submit] {
   margin-bottom: 0;
 }
 
diff --git a/update.php b/update.php
index 1d6bc49..d4b794a 100644
--- a/update.php
+++ b/update.php
@@ -246,7 +246,7 @@ function update_info_page() {
   $output .= "</ol>\n";
   $output .= "<p>When you have performed the steps above, you may proceed.</p>\n";
   $form_action = check_url(drupal_current_script_url(array('op' => 'selection', 'token' => $token)));
-  $output .= '<form method="post" action="' . $form_action . '"><p><input type="submit" value="Continue" class="form-submit" /></p></form>';
+  $output .= '<form method="post" action="' . $form_action . '"><p><input type="submit" value="Continue" /></p></form>';
   $output .= "\n";
   return $output;
 }
