diff --git includes/file.inc includes/file.inc
index 676d274..6f79518 100644
--- includes/file.inc
+++ includes/file.inc
@@ -90,16 +90,24 @@ define('FILE_STATUS_PERMANENT', 1);
  *
  * A stream is referenced as "scheme://target".
  *
+ * @param $filter
+ *  Optionally filter out all types except these.  Defaults to
+ *  STREAM_WRAPPER_WRITABLEL. Set to 0 to not filter.
+ *
  * @return
  *   Returns the entire Drupal stream wrapper registry.
  * @see hook_stream_wrappers()
  * @see hook_stream_wrappers_alter()
  */
-function file_get_stream_wrappers() {
-  $wrappers = &drupal_static(__FUNCTION__);
+function file_get_stream_wrappers($filter = STREAM_WRAPPER_WRITE_VISIBLE) {
+  $wrappers_storage = &drupal_static(__FUNCTION__);
 
-  if (!isset($wrappers)) {
+  if (!isset($wrappers_storage)) {
     $wrappers = module_invoke_all('stream_wrappers');
+    foreach ($wrappers as $scheme => $info) {
+      // Add defaults.
+      $wrappers[$scheme] += array('type' => STREAM_WRAPPER_NORMAL);
+    }
     drupal_alter('stream_wrappers', $wrappers);
     $existing = stream_get_wrappers();
     foreach ($wrappers as $scheme => $info) {
@@ -115,9 +123,25 @@ function file_get_stream_wrappers() {
         }
         stream_wrapper_register($scheme, $info['class']);
       }
+      $wrappers_storage[0][$scheme] = $wrappers[$scheme];
+      if (($info['type'] & STREAM_WRAPPER_WRITE_VISIBLE) == STREAM_WRAPPER_WRITE_VISIBLE) {
+        $wrappers_storage[STREAM_WRAPPER_WRITE_VISIBLE][$scheme] = $wrappers[$scheme];
+      }
     }
   }
-  return $wrappers;
+
+  if (isset($wrappers_storage[$filter])) {
+    return $wrappers_storage[$filter];
+  }
+  $filtered = array();
+  foreach ($wrappers_storage[0] as $scheme => $info) {
+    // Bit-wise filter.
+    if ($info['type'] & $filter == $filter) {
+      $filtered[$scheme] = $info;
+    }
+  }
+
+  return $filtered;
 }
 
 /**
diff --git includes/stream_wrappers.inc includes/stream_wrappers.inc
index 183af42..4a87447 100644
--- includes/stream_wrappers.inc
+++ includes/stream_wrappers.inc
@@ -20,6 +20,18 @@
  * @link http://bugs.php.net/bug.php?id=47070
  */
 
+define ('STREAM_WRAPPER_LOCAL', 0x0001);
+define ('STREAM_WRAPPER_REMOTE', 0x0002);
+define ('STREAM_WRAPPER_READ', 0x0004);
+define ('STREAM_WRAPPER_WRITE', 0x0008);
+define ('STREAM_WRAPPER_VISIBLE', 0x0010);
+
+// Never exposed in the UI or via web.  E.g. the temporary directory for uploads.
+define ('STREAM_WRAPPER_HIDDEN', STREAM_WRAPPER_READ | STREAM_WRAPPER_WRITE);
+define ('STREAM_WRAPPER_WRITE_VISIBLE', STREAM_WRAPPER_READ | STREAM_WRAPPER_WRITE | STREAM_WRAPPER_VISIBLE);
+define ('STREAM_WRAPPER_READ_VISIBLE', STREAM_WRAPPER_READ | STREAM_WRAPPER_VISIBLE);
+define ('STREAM_WRAPPER_NORMAL', STREAM_WRAPPER_LOCAL | STREAM_WRAPPER_WRITE_VISIBLE);
+
 /**
  * Generic PHP stream wrapper interface.
  *
diff --git modules/file/file.field.inc modules/file/file.field.inc
index 536182a..68b3360 100644
--- modules/file/file.field.inc
+++ modules/file/file.field.inc
@@ -86,10 +86,8 @@ function file_field_settings_form($field, $instance, $has_data) {
   );
 
   $scheme_options = array();
-  foreach (file_get_stream_wrappers() as $scheme => $stream_wrapper) {
-    if ($scheme != 'temporary') {
-      $scheme_options[$scheme] = $stream_wrapper['name'];
-    }
+  foreach (file_get_stream_wrappers(STREAM_WRAPPER_WRITABLE) as $scheme => $stream_wrapper) {
+    $scheme_options[$scheme] = $stream_wrapper['name'];
   }
   $form['uri_scheme'] = array(
     '#type' => 'radios',
diff --git modules/system/system.module modules/system/system.module
index 1f7d348..d8267a2 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -1466,6 +1466,7 @@ function system_stream_wrappers() {
       'name' => t('Temporary files'),
       'class' => 'DrupalTemporaryStreamWrapper',
       'description' => t('Temporary local files for upload and previews.'),
+      'type' => STREAM_WRAPPER_HIDDEN,
     )
   );
 }
