diff --git a/file_entity.admin.inc b/file_entity.admin.inc
index bb1b2ed..dd9db1e 100644
--- a/file_entity.admin.inc
+++ b/file_entity.admin.inc
@@ -375,8 +375,18 @@ function theme_file_entity_file_display_order($variables) {
  * @see file_entity_file_type_form_validate()
  * @see file_entity_file_type_form_submit()
  */
-function file_entity_file_type_form($form, &$form_state, $type) {
-  $form['#file_type'] = $type->type;
+function file_entity_file_type_form($form, &$form_state, $type = NULL) {
+  if (!isset($type->type)) {
+    // This is a new type.
+    $type = (object) array(
+      'type' => '',
+      'label' => '',
+      'description' => '',
+      'streams' => array(),
+      'mimetypes' => array(),
+    );
+  }
+  $form['#file_type'] = $type;
 
   $form['label'] = array(
     '#type' => 'textfield',
@@ -385,6 +395,18 @@ function file_entity_file_type_form($form, &$form_state, $type) {
     '#required' => TRUE,
     '#default_value' => $type->label,
   );
+
+  $form['type'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => $type->type,
+    '#maxlength' => 255,
+    '#disabled' => (bool) $type->type,
+    '#machine_name' => array(
+      'exists' => 'file_type_load',
+    ),
+    '#description' => t('A unique machine-readable name for this file type. It must only contain lowercase letters, numbers, and underscores.'),
+  );
+
   $form['description'] = array(
     '#type' => 'textarea',
     '#title' => t('Description'),
@@ -464,8 +486,14 @@ function file_entity_file_type_form_validate($form, &$form_state) {
  * @see file_entity_file_type_form_validate()
  */
 function file_entity_file_type_form_submit($form, &$form_state) {
-  $type = file_type_load($form['#file_type']);
-
+  if (!empty($form['#file_type']->type)) {
+    $type = file_type_load($form['#file_type']);
+  }
+  else {
+    $type = (object) array(
+      'type' => $form_state['values']['type'],
+    );
+  }
   $type->label = $form_state['values']['label'];
   $type->description = $form_state['values']['description'];
   $type->mimetypes = array_filter(array_map('trim', explode("\n", $form_state['values']['mimetypes'])));
diff --git a/file_entity.module b/file_entity.module
index 77ec6ea..7d8193f 100644
--- a/file_entity.module
+++ b/file_entity.module
@@ -111,6 +111,14 @@ function file_entity_menu() {
     'access arguments' => array('administer file types'),
     'file' => 'file_entity.admin.inc',
   );
+  $items['admin/structure/file-types/add'] = array(
+    'title' => 'Add file type',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('file_entity_file_type_form'),
+    'access arguments' => array('administer file types'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'file_entity.admin.inc',
+  );
   $items['admin/structure/file-types/manage/%file_type'] = array(
     'title' => 'Manage file types',
     'description' => 'Manage settings for the type of files used on your site.',
