diff --git a/includes/common.inc b/includes/common.inc
index 1ef681f..273aa31 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -1828,22 +1828,41 @@ function format_interval($timestamp, $granularity = 2, $langcode = NULL) {
 }
 
 /**
- * Formats a date, using a date type or a custom date format string.
+ * Formats a date, using a date type.
  *
  * @param $timestamp
  *   A UNIX timestamp to format.
  * @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'.
+ * @param $timezone
+ *   (optional) Time zone identifier, as described at
+ *   http://php.net/manual/en/timezones.php Defaults to the time zone used to
+ *   display the page.
+ * @param $langcode
+ *   (optional) Language code to translate to. Defaults to the language used to
+ *   display the page.
+ *
+ * @return
+ *   A translated date string in the requested format.
+ */
+function format_date($timestamp, $type = 'medium', $timezone = NULL, $langcode = NULL) {
+  $format = variable_get("date_format_$type");
+  return format_date_format($timestamp, $format, $timezone, $langcode);
+}
+
+/**
+ *  Formats a date, using a custom date format string.
+ *
+ * @param $timestamp
+ *   A UNIX timestamp to format.
  * @param $format
- *   (optional) If $type is 'custom', a PHP date format string suitable for
- *   input to date(). Use a backslash to escape ordinary text, so it does not
- *   get interpreted as date format characters.
+ *   If $type is 'custom', a PHP date format string suitable for input to
+ *   date(). Use a backslash to escape ordinary text, so it does not get
+ *   interpreted as date format characters.
  * @param $timezone
  *   (optional) Time zone identifier, as described at
  *   http://php.net/manual/en/timezones.php Defaults to the time zone used to
@@ -1855,7 +1874,7 @@ function format_interval($timestamp, $granularity = 2, $langcode = NULL) {
  * @return
  *   A translated date string in the requested format.
  */
-function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
+function format_date_format($timestamp, $format = '', $timezone = NULL, $langcode = NULL) {
   // Use the advanced drupal_static() pattern, since this is called very often.
   static $drupal_static_fast;
   if (!isset($drupal_static_fast)) {
@@ -1878,32 +1897,6 @@ 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;
-  }
-
   // Create a DateTime object from the timestamp.
   $date_time = date_create('@' . $timestamp);
   // Set the time zone for the DateTime object.
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index ab3e0fc..586554d 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -3778,15 +3778,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
@@ -3794,7 +3787,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()
@@ -3802,9 +3798,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 3737af1..6e593c2 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -3510,9 +3510,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',
+    ),
   );
 }
 
@@ -3659,15 +3668,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.
+      // Will be overridden 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_$module_type", $info['default format']);
+      }
     }
   }
 
