diff --git modules/file/file.field.inc modules/file/file.field.inc
index b7372c4..ab4204e 100644
--- modules/file/file.field.inc
+++ modules/file/file.field.inc
@@ -441,7 +441,6 @@ function file_field_widget_settings_form($field, $instance) {
  * Implements hook_field_widget_form().
  */
 function file_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  $form['#attributes'] = array('enctype' => 'multipart/form-data');
 
   $defaults = array(
     'fid' => 0,
diff --git modules/file/file.module modules/file/file.module
index fcda65b..3ba0f99 100644
--- modules/file/file.module
+++ modules/file/file.module
@@ -390,7 +390,6 @@ function file_managed_file_process($element, &$form_state, $form) {
     '#value' => t('Upload'),
     '#validate' => array(),
     '#submit' => array('file_managed_file_submit'),
-    '#limit_validation_errors' => array($element['#parents']),
     '#ajax' => $ajax_settings,
     '#weight' => -5,
   );
@@ -404,11 +403,16 @@ function file_managed_file_process($element, &$form_state, $form) {
     '#value' => t('Remove'),
     '#validate' => array(),
     '#submit' => array('file_managed_file_submit'),
-    '#limit_validation_errors' => array($element['#parents']),
     '#ajax' => $ajax_settings,
     '#weight' => -5,
   );
 
+  // Limit validation errors to the file field only. The entire field is needed later
+  // by file_field_widget_form(), so the last element is sliced off the #parents array
+  // to avoid removing too much from $form_state['values'].
+  $element['upload_button']['#limit_validation_errors'] = array(array_slice($element['#parents'], 0, -1));
+  $element['remove_button']['#limit_validation_errors'] = array(array_slice($element['#parents'], 0, -1));
+
   $element['fid'] = array(
     '#type' => 'hidden',
     '#value' => $fid,
diff --git modules/file/tests/file.test modules/file/tests/file.test
index 7e1457e..00928c8 100644
--- modules/file/tests/file.test
+++ modules/file/tests/file.test
@@ -114,8 +114,8 @@ class FileFieldTestCase extends DrupalWebTestCase {
     );
 
     if (is_numeric($nid_or_type)) {
-      $node = node_load($nid_or_type);
-      $delta = isset($node->$field_name) ? count($node->$field_name) : 0;
+      $node = node_load($nid_or_type, NULL, TRUE);
+      $delta = isset($node->{$field_name}[LANGUAGE_NONE]) ? count($node->{$field_name}[LANGUAGE_NONE]) : 0;
       $edit['files[' . $field_name . '_' . LANGUAGE_NONE . '_' . $delta . ']'] = drupal_realpath($file->uri);
       $this->drupalPost('node/' . $nid_or_type . '/edit', $edit, t('Save'));
     }
