diff --git a/includes/language.inc b/includes/language.inc
index 803a630..cbf36bd 100644
--- a/includes/language.inc
+++ b/includes/language.inc
@@ -428,8 +428,6 @@ function language_provider_invoke($provider_id, $provider = NULL) {
   $results = &drupal_static(__FUNCTION__);
 
   if (!isset($results[$provider_id])) {
-    global $user;
-
     // Get languages grouped by status and select only the enabled ones.
     $languages = language_list('enabled');
     $languages = $languages[1];
@@ -443,11 +441,8 @@ function language_provider_invoke($provider_id, $provider = NULL) {
       require_once DRUPAL_ROOT . '/' . $provider['file'];
     }
 
-    // If the language negotiation 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', 0);
     $callback = isset($provider['callbacks']['language']) ? $provider['callbacks']['language'] : FALSE;
-    $langcode = $cache && function_exists($callback) ? $callback($languages) : FALSE;
+    $langcode = function_exists($callback) ? $callback($languages) : FALSE;
     $results[$provider_id] = isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
   }
 
diff --git a/includes/locale.inc b/includes/locale.inc
index c168da0..33398dc 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -133,6 +133,10 @@ function locale_language_from_browser($languages) {
     return FALSE;
   }
 
+  // Browser language detection is not compatible with page caching, ensure
+  // this page is not cached.
+  drupal_page_is_cacheable(FALSE);
+
   // The Accept-Language header contains information about the language
   // preferences configured in the user's browser / operating system.
   // RFC 2616 (section 14.4) defines the Accept-Language header as follows:
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index 768fead..b94f3ae 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -606,7 +606,6 @@ function locale_language_negotiation_info() {
     'callbacks' => array('language' => 'locale_language_from_browser'),
     'file' => $file,
     'weight' => -2,
-    'cache' => 0,
     'name' => t('Browser'),
     'description' => t("Determine the language from the browser's language settings."),
   );
diff --git a/modules/system/language.api.php b/modules/system/language.api.php
index 40bb3f3..f68f150 100644
--- a/modules/system/language.api.php
+++ b/modules/system/language.api.php
@@ -131,8 +131,6 @@ function hook_language_types_info_alter(array &$language_types) {
  *   - name: The translated human-readable name for the provider.
  *   - description: A translated longer description of the provider.
  *   - config: An internal path pointing to the provider's configuration page.
- *   - cache: The value Drupal's page cache should be set to for the current
- *     provider to be invoked.
  *
  * @see hook_language_negotiation_info_alter()
  * @ingroup language_negotiation
@@ -150,7 +148,6 @@ function hook_language_negotiation_info() {
       'types' => array('custom_language_type'),
       'name' => t('Custom language negotiation provider'),
       'description' => t('This is a custom language negotiation provider.'),
-      'cache' => 0,
     ),
   );
 }
