diff --git includes/bootstrap.inc includes/bootstrap.inc
index 1a53a89..9990dd0 100644
--- includes/bootstrap.inc
+++ includes/bootstrap.inc
@@ -49,16 +49,6 @@ define('CACHE_PERMANENT', 0);
 define('CACHE_TEMPORARY', -1);
 
 /**
- * Indicates that page caching is disabled.
- */
-define('CACHE_DISABLED', 0);
-
-/**
- * Indicates that page caching is enabled, using "normal" mode.
- */
-define('CACHE_NORMAL', 1);
-
-/**
  * Log message severity -- Emergency: system is unusable.
  *
  * @see watchdog()
@@ -1096,7 +1086,7 @@ function drupal_serve_page_from_cache(stdClass $cache) {
   // do not bother caching the page in a public proxy, because the cached copy
   // will only be served to that particular user due to Vary: Cookie, unless
   // the Vary header has been replaced or unset in hook_boot() (see below).
-  $max_age = !variable_get('page_cache_invoke_hooks', TRUE) && (!isset($_COOKIE[session_name()]) || isset($hook_boot_headers['vary'])) ? variable_get('cache_lifetime', 0) : 0;
+  $max_age = !variable_get('page_cache_invoke_hooks', TRUE) && (!isset($_COOKIE[session_name()]) || isset($hook_boot_headers['vary'])) ? variable_get('page_cache_maximum_age', 0) : 0;
   $default_headers['Cache-Control'] = 'public, max-age=' . $max_age;
 
   // Entity tag should change if the output changes.
@@ -1982,16 +1972,16 @@ function _drupal_bootstrap_page_cache() {
   }
   // Check for a cache mode force from settings.php.
   if (variable_get('page_cache_without_database')) {
-    $cache_mode = CACHE_NORMAL;
+    $cache_enabled = TRUE;
   }
   else {
     drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES, FALSE);
-    $cache_mode = variable_get('cache');
+    $cache_enabled = variable_get('cache');
   }
   drupal_block_denied(ip_address());
   // If there is no session cookie and cache is enabled (or forced), try
   // to serve a cached page.
-  if (!isset($_COOKIE[session_name()]) && $cache_mode == CACHE_NORMAL) {
+  if (!isset($_COOKIE[session_name()]) && $cache_enabled) {
     // Make sure there is a user object because it's timestamp will be
     // checked, hook_boot might check for anonymous user etc.
     $user = drupal_anonymous_user();
diff --git includes/common.inc includes/common.inc
index 9feae77..b4606ea 100644
--- includes/common.inc
+++ includes/common.inc
@@ -2431,7 +2431,7 @@ function drupal_page_footer() {
   // Commit the user session, if needed.
   drupal_session_commit();
 
-  if (variable_get('cache', CACHE_DISABLED) != CACHE_DISABLED && ($cache = drupal_page_set_cache())) {
+  if (variable_get('cache', 0) && ($cache = drupal_page_set_cache())) {
     drupal_serve_page_from_cache($cache);
   }
   else {
diff --git includes/form.inc includes/form.inc
index fb13693..1773e40 100644
--- includes/form.inc
+++ includes/form.inc
@@ -651,7 +651,7 @@ function drupal_process_form($form_id, &$form, &$form_state) {
       // We'll clear out the cached copies of the form and its stored data
       // here, as we've finished with them. The in-memory copies are still
       // here, though.
-      if (variable_get('cache', CACHE_DISABLED) == CACHE_DISABLED && !empty($form_state['values']['form_build_id'])) {
+      if (!variable_get('cache', 0) && !empty($form_state['values']['form_build_id'])) {
         cache_clear_all('form_' . $form_state['values']['form_build_id'], 'cache_form');
         cache_clear_all('storage_' . $form_state['values']['form_build_id'], 'cache_form');
       }
diff --git includes/language.inc includes/language.inc
index 1b55a18..03e7870 100644
--- includes/language.inc
+++ includes/language.inc
@@ -283,7 +283,7 @@ function language_provider_invoke($provider_id, $provider = NULL) {
 
     // If the language provider has no cache preference or this is satisfied
     // we can execute the callback.
-    $cache = !isset($provider['cache']) || $user->uid || $provider['cache'] == variable_get('cache', CACHE_DISABLED);
+    $cache = !isset($provider['cache']) || $user->uid || $provider['cache'] == variable_get('cache', 0);
     $callback = isset($provider['callbacks']['language']) ? $provider['callbacks']['language'] : FALSE;
     $langcode = $cache && function_exists($callback) ? $callback($languages) : FALSE;
     $results[$provider_id] = isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
diff --git modules/poll/poll.test modules/poll/poll.test
index 717a3d8..7e06bad 100644
--- modules/poll/poll.test
+++ modules/poll/poll.test
@@ -375,7 +375,7 @@ class PollVoteCheckHostname extends PollTestCase {
 
     // Enable page cache to verify that the result page is not saved in the
     // cache when anonymous voting is allowed.
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
 
     // Create poll.
     $title = $this->randomName();
diff --git modules/simpletest/tests/bootstrap.test modules/simpletest/tests/bootstrap.test
index 10c434c..749f74b 100644
--- modules/simpletest/tests/bootstrap.test
+++ modules/simpletest/tests/bootstrap.test
@@ -105,7 +105,7 @@ class BootstrapPageCacheTestCase extends DrupalWebTestCase {
    * Test support for requests containing If-Modified-Since and If-None-Match headers.
    */
   function testConditionalRequests() {
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
 
     // Fill the cache.
     $this->drupalGet('');
@@ -143,7 +143,7 @@ class BootstrapPageCacheTestCase extends DrupalWebTestCase {
    * Test cache headers.
    */
   function testPageCache() {
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
 
     // Fill the cache.
     $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Foo', 'value' => 'bar')));
@@ -187,7 +187,7 @@ class BootstrapPageCacheTestCase extends DrupalWebTestCase {
    * mod_deflate Apache module.
    */
   function testPageCompression() {
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
 
     // Fill the cache and verify that output is compressed.
     $this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
@@ -287,7 +287,7 @@ class HookBootExitTestCase extends DrupalWebTestCase {
     $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_exit'))->fetchField(), $calls, t('hook_exit called with disabled cache.'));
 
     // Test with normal cache. Boot and exit should be called.
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
     $this->drupalGet('');
     $calls++;
     $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_boot'))->fetchField(), $calls, t('hook_boot called with normal cache.'));
diff --git modules/simpletest/tests/session.test modules/simpletest/tests/session.test
index 74ffab9..385cf37 100644
--- modules/simpletest/tests/session.test
+++ modules/simpletest/tests/session.test
@@ -140,7 +140,7 @@ class SessionTestCase extends DrupalWebTestCase {
     $this->assertSessionEmpty(TRUE);
 
     // The same behavior is expected when caching is enabled.
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
     $this->drupalGet('');
     $this->assertSessionCookie(FALSE);
     $this->assertSessionEmpty(TRUE);
diff --git modules/system/system.admin.inc modules/system/system.admin.inc
index c462fb6..a93f2b6 100644
--- modules/system/system.admin.inc
+++ modules/system/system.admin.inc
@@ -1622,12 +1622,12 @@ function system_performance_settings() {
     '#title' => t('Caching'),
   );
 
-  $cache = variable_get('cache', CACHE_DISABLED);
+  $cache = variable_get('cache', 0);
   $form['caching']['cache'] = array(
-    '#type' => 'radios',
-    '#title' => t('Page cache for anonymous users'),
+    '#type' => 'checkbox',
+    '#title' => t('Cache pages for anonymous users'),
     '#default_value' => $cache,
-    '#options' => array(CACHE_DISABLED => t('Disabled'), CACHE_NORMAL => t('Normal (recommended)')),
+    '#weight' => -2,
   );
   $period = drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval');
   $period[0] = '<' . t('none') . '>';
@@ -1636,7 +1636,14 @@ function system_performance_settings() {
     '#title' => t('Minimum cache lifetime'),
     '#default_value' => variable_get('cache_lifetime', 0),
     '#options' => $period,
-    '#description' => t('The minimum amount of time that will elapse before the caches are recreated.')
+    '#description' => t('Cached pages will not be re-created until at least this much time has elapsed.')
+  );
+  $form['caching']['page_cache_maximum_age'] = array(
+    '#type' => 'select',
+    '#title' => t('Expiration of cached pages'),
+    '#default_value' => variable_get('page_cache_maximum_age', 0),
+    '#options' => $period,
+    '#description' => t('The maximum age value that is sent in page headers to external caches.')
   );
 
   $directory = 'public://';
diff --git modules/system/system.install modules/system/system.install
index 1a9acce..7b05b56 100644
--- modules/system/system.install
+++ modules/system/system.install
@@ -1995,7 +1995,7 @@ function system_update_7032() {
  */
 function system_update_7033() {
   if (variable_get('cache') == 2) {
-    variable_set('cache', CACHE_NORMAL);
+    variable_set('cache', 1);
     return t('Aggressive caching was disabled and replaced with normal caching. Read the page caching section in default.settings.php for more information on how to enable similar functionality.');
   }
 }
