diff --git a/includes/common.inc b/includes/common.inc
index e9286f4..61a063b 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -1829,8 +1829,7 @@ function format_interval($timestamp, $granularity = 2, $langcode = NULL) {
  * @param $type
  *   (optional) The format to use, one of:
  *   - 'short', 'medium', or 'long' (the corresponding built-in date formats).
- *   - The name of a date type defined by a module in hook_date_format_types(),
- *     if it's been assigned a format.
+ *   - The name of a date type defined by a module in hook_date_format_types().
  *   - The machine name of an administrator-defined date format.
  *   - 'custom', to use $format.
  *   Defaults to 'medium'.
@@ -1872,31 +1871,7 @@ function format_date($timestamp, $type = 'medium', $format = '', $timezone = NUL
     $langcode = isset($language->language) ? $language->language : 'en';
   }
 
-  switch ($type) {
-    case 'short':
-      $format = variable_get('date_format_short', 'm/d/Y - H:i');
-      break;
-
-    case 'long':
-      $format = variable_get('date_format_long', 'l, F j, Y - H:i');
-      break;
-
-    case 'custom':
-      // No change to format.
-      break;
-
-    case 'medium':
-    default:
-      // Retrieve the format of the custom $type passed.
-      if ($type != 'medium') {
-        $format = variable_get('date_format_' . $type, '');
-      }
-      // Fall back to 'medium'.
-      if ($format === '') {
-        $format = variable_get('date_format_medium', 'D, m/d/Y - H:i');
-      }
-      break;
-  }
+  $format = variable_get("date_format_$type");
 
   // Create a DateTime object from the timestamp.
   $date_time = date_create('@' . $timestamp);
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index 5481e81..25d98d1 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -3727,15 +3727,8 @@ function hook_archiver_info_alter(&$info) {
  *
  * Date types are used in the administration interface: a user can assign
  * date format types defined in hook_date_formats() to date types defined in
- * this hook. Once a format has been assigned by a user, the machine name of a
- * type can be used in the format_date() function to format a date using the
- * chosen formatting.
- *
- * To define a date type in a module and make sure a format has been assigned to
- * it, without requiring a user to visit the administrative interface, use
- * @code variable_set('date_format_' . $type, $format); @endcode
- * where $type is the machine-readable name defined here, and $format is a PHP
- * date format string.
+ * this hook. The machine name of a type can be used in the format_date()
+ * function to format a date using the chosen formatting.
  *
  * To avoid namespace collisions with date types defined by other modules, it is
  * recommended that each date type starts with the module name. A date type
@@ -3743,7 +3736,10 @@ function hook_archiver_info_alter(&$info) {
  *
  * @return
  *   An array of date types where the keys are the machine-readable names and
- *   the values are the human-readable labels.
+ *   the values are arrays with the following keys:
+ *   - title: The human-readable name of the date type.
+ *   - default format: The default date format to use for this date type, if
+ *     none has been explicitly set.
  *
  * @see hook_date_formats()
  * @see format_date()
@@ -3751,9 +3747,18 @@ function hook_archiver_info_alter(&$info) {
 function hook_date_format_types() {
   // Define the core date format types.
   return array(
-    'long' => t('Long'),
-    'medium' => t('Medium'),
-    'short' => t('Short'),
+    'long' => array(
+      'title' => t('Long'),
+      'default format' => 'l, F j, Y - H:i',
+    ),
+    'medium' => array(
+      'title' => t('Medium'),
+      'default format' => 'D, m/d/Y - H:i',
+    ),
+    'short' => array(
+      'title' => t('Short'),
+      'default format' => 'm/d/Y - H:i',
+    ),
   );
 }
 
diff --git a/modules/system/system.module b/modules/system/system.module
index 6537671..d1695d7 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -3501,9 +3501,18 @@ function system_get_date_types($type = NULL) {
  */
 function system_date_format_types() {
   return array(
-    'long' => t('Long'),
-    'medium' => t('Medium'),
-    'short' => t('Short'),
+    'long' => array(
+      'title' => t('Long'),
+      'default format' => 'l, F j, Y - H:i',
+    ),
+    'medium' => array(
+      'title' => t('Medium'),
+      'default format' => 'D, m/d/Y - H:i',
+    ),
+    'short' => array(
+      'title' => t('Short'),
+      'default format' => 'm/d/Y - H:i',
+    ),
   );
 }
 
@@ -3650,15 +3659,21 @@ function _system_date_format_types_build() {
 
   foreach ($modules as $module) {
     $module_types = module_invoke($module, 'date_format_types');
-    foreach ($module_types as $module_type => $type_title) {
+    foreach ($module_types as $module_type => $info) {
       $type = array();
       $type['module'] = $module;
       $type['type'] = $module_type;
-      $type['title'] = $type_title;
+      $type['title'] = $info['title'];
       $type['locked'] = 1;
       // Will be over-ridden later if in the db.
       $type['is_new'] = TRUE;
       $types[$module_type] = $type;
+
+      // Set date format, if not set.
+      $format = variable_get("date_format_$module_type");
+      if (!isset($format)) {
+        variable_set("date_format_$type", $info['default format']);
+      }
     }
   }
 
