The client didn't like the interface where the form upload widget was on one page but then all of the entity fields were on another (I disabled the file type and schema selection fields because we're only using one type and we want all files to be private; Configuration > Media> File upload settings, "File upload wizard" fieldset). I couldn't find any way in the UI to do this and couldn't find an issue for it in the queue, so I looked at the code and started experimenting. Turns out it's surprisingly easy to do with a simple hook_form_FORM_ID_alter() implementation, so I thought I'd share for others looking to do this in the future.

/**
 * Implements hook_form_FORM_ID_alter() for the file upload form.
 *
 * Put all the entity form fields on the same page as the file upload form.
 *
 * Frankly, I'm kind of surprised it's this easy.
 */
function foo_module_form_file_entity_add_upload_alter(&$form, &$form_state) {
  $file = new stdClass();
  $file->type = 'foo_document'; /* Change to desired type */

  field_attach_form('file', $file, $form, $form_state);

  $form['actions']['next']['#value'] = t('Submit');
}

And there you go. After saving the form, the file will be saved with all fields (even file fields) working as expected. You can then disable the entity form page of the wizard as well.