Index: modules/node/node.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.install,v
retrieving revision 1.60
diff -u -p -r1.60 node.install
--- modules/node/node.install	7 Oct 2010 00:28:20 -0000	1.60
+++ modules/node/node.install	7 Oct 2010 18:20:18 -0000
@@ -521,7 +521,7 @@ function node_update_7004() {
 
   // Map old preview setting to new values order.
   $original_preview ? $original_preview = 2 : $original_preview = 1;
-  drupal_static_reset('_node_types_build');
+  node_type_cache_reset();
 
   // Apply original settings to all types.
   foreach (_update_7000_node_get_types() as $type => $type_object) {
@@ -552,7 +552,7 @@ function node_update_7006(&$sandbox) {
   $sandbox['#finished'] = 0;
 
   // Get node type info for every invocation.
-  drupal_static_reset('_node_types_build');
+  node_type_cache_reset();
 
   if (!isset($sandbox['total'])) {
     // Initial invocation.
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1305
diff -u -p -r1.1305 node.module
--- modules/node/node.module	Thu Oct 07 02:28:20 2010
+++ modules/node/node.module	Thu Oct 07 22:18:28 2010
@@ -533,7 +533,7 @@
   }
 
   // Clear the node type cache.
-  drupal_static_reset('_node_types_build');
+  node_type_cache_reset();
 
   return $status;
 }
@@ -624,7 +624,7 @@
   module_invoke_all('node_type_delete', $info);
 
   // Clear the node type cache.
-  drupal_static_reset('_node_types_build');
+  node_type_cache_reset();
 }
 
 /**
@@ -669,14 +669,20 @@
  *   type object by $type->disabled being set to TRUE.
  */
 function _node_types_build($rebuild = FALSE) {
+  $cid = 'node_types:' . $GLOBALS['language']->language;
+
   if (!$rebuild) {
     $_node_types = &drupal_static(__FUNCTION__);
-    if (is_object($_node_types)) {
+    if (isset($_node_types)) {
+      return $_node_types;
+    }
+    if ($cache = cache_get($cid)) {
+      $_node_types = $cache->data;
       return $_node_types;
     }
   }
 
-  $_node_types = (object)array('types' => array(), 'names' => array());
+  $_node_types = (object) array('types' => array(), 'names' => array());
 
   foreach (module_implements('node_info') as $module) {
     $info_array = module_invoke($module, 'node_info');
@@ -732,10 +738,20 @@
 
   asort($_node_types->names);
 
+  cache_set($cid, $_node_types);
+
   return $_node_types;
 }
 
 /**
+ * Clears the node type cache.
+ */
+function node_type_cache_reset() {
+  cache_clear_all('node_types:', 'cache', TRUE);
+  drupal_static_reset('_node_types_build');
+}
+
+/**
  * Set the default values for a node type.
  *
  * The defaults are for a type defined through hook_node_info().
@@ -746,33 +762,26 @@
  *   An object or array containing values to override the defaults.
  *
  * @return
- *  A node type object.
+ *   A node type object.
  */
 function node_type_set_defaults($info = array()) {
-  $type = &drupal_static(__FUNCTION__);
-
-  if (!isset($type)) {
-    $type = new stdClass();
-    $type->type = '';
-    $type->name = '';
-    $type->base = '';
-    $type->description = '';
-    $type->help = '';
-    $type->custom = 0;
-    $type->modified = 0;
-    $type->locked = 1;
-    $type->disabled = 0;
-    $type->is_new = 1;
-
-    $type->has_title = 1;
-    $type->title_label = 'Title';
-  }
-
-  $new_type = clone $type;
   $info = (array) $info;
-  foreach ($info as $key => $data) {
-    $new_type->$key = $data;
-  }
+  $new_type = $info + array(
+    'type' => '',
+    'name' => '',
+    'base' => '',
+    'description' => '',
+    'help' => '',
+    'custom' => 0,
+    'modified' => 0,
+    'locked' => 1,
+    'disabled' => 0,
+    'is_new' => 1,
+    'has_title' => 1,
+    'title_label' => 'Title',
+  );
+  $new_type = (object) $new_type;
+
   // If the type has no title, set an empty label.
   if (!$new_type->has_title) {
     $new_type->title_label = '';
@@ -1909,7 +1918,7 @@
   // @todo Remove this loop when we have a 'description callback' property.
   // Reset internal static cache of _node_types_build(), forces to rebuild the
   // node type information.
-  drupal_static_reset('_node_types_build');
+  node_type_cache_reset();
   foreach (node_type_get_types() as $type) {
     $type_url_str = str_replace('_', '-', $type->type);
     $items['node/add/' . $type_url_str] = array(