Index: wp-admin/includes/upgrade.php
===================================================================
--- wp-admin/includes/upgrade.php	(revision 18783)
+++ wp-admin/includes/upgrade.php	(working copy)
@@ -451,6 +451,9 @@
 	if ( $wp_current_db_version < 15260 )
 		upgrade_300();
 
+	if ( $wp_current_db_version < 11548 )
+		upgrade_old_widgets_order_array();
+
 	maybe_disable_automattic_widgets();
 
 	update_option( 'db_version', $wp_db_version );
@@ -1132,6 +1135,68 @@
 }
 
 /**
+ * Convert the old style widgets order array from 2.2.
+ *
+ * @since 3.3.0
+ */
+function upgrade_old_widgets_order_array() {
+	global $wp_registered_widgets, $sidebars_widgets;
+
+	$sidebars_widgets = get_option( 'sidebars_widgets', array() );
+	$_sidebars_widgets = array();
+
+	if ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) )
+		$sidebars_widgets['array_version'] = 3;
+	elseif ( !isset($sidebars_widgets['array_version']) )
+		$sidebars_widgets['array_version'] = 1;
+
+	switch ( $sidebars_widgets['array_version'] ) {
+		case 1 :
+			foreach ( (array) $sidebars_widgets as $index => $sidebar )
+			if ( is_array($sidebar) )
+			foreach ( (array) $sidebar as $i => $name ) {
+				$id = strtolower($name);
+				if ( isset($wp_registered_widgets[$id]) ) {
+					$_sidebars_widgets[$index][$i] = $id;
+					continue;
+				}
+				$id = sanitize_title($name);
+				if ( isset($wp_registered_widgets[$id]) ) {
+					$_sidebars_widgets[$index][$i] = $id;
+					continue;
+				}
+
+				$found = false;
+
+				foreach ( $wp_registered_widgets as $widget_id => $widget ) {
+					if ( strtolower($widget['name']) == strtolower($name) ) {
+						$_sidebars_widgets[$index][$i] = $widget['id'];
+						$found = true;
+						break;
+					} elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) {
+						$_sidebars_widgets[$index][$i] = $widget['id'];
+						$found = true;
+						break;
+					}
+				}
+
+				if ( $found )
+					continue;
+
+				unset($_sidebars_widgets[$index][$i]);
+			}
+			$_sidebars_widgets['array_version'] = 2;
+			$sidebars_widgets = $_sidebars_widgets;
+			unset($_sidebars_widgets);
+
+		case 2 :
+			$sidebars_widgets = retrieve_widgets();
+			$sidebars_widgets['array_version'] = 3;
+			update_option( 'sidebars_widgets', $sidebars_widgets );
+	}
+}
+
+/**
  * Execute network level changes
  *
  * @since 3.0.0
Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 18783)
+++ wp-includes/theme.php	(working copy)
@@ -1248,9 +1248,8 @@
 function switch_theme($template, $stylesheet) {
 	global $wp_theme_directories, $sidebars_widgets;
 
-	if ( ! is_array( $sidebars_widgets ) )
-		$sidebars_widgets = wp_get_sidebars_widgets();
-	set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $sidebars_widgets ) );
+	if ( is_array( $sidebars_widgets ) )
+		set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $sidebars_widgets ) );
 
 	$old_theme = get_current_theme();
 
Index: wp-includes/widgets.php
===================================================================
--- wp-includes/widgets.php	(revision 18783)
+++ wp-includes/widgets.php	(working copy)
@@ -998,7 +998,7 @@
 	if ( $deprecated !== true )
 		_deprecated_argument( __FUNCTION__, '2.8.1' );
 
-	global $wp_registered_widgets, $wp_registered_sidebars, $_wp_sidebars_widgets;
+	global $wp_registered_widgets, $_wp_sidebars_widgets, $sidebars_widgets;
 
 	// If loading from front page, consult $_wp_sidebars_widgets rather than options
 	// to see if wp_convert_widget_settings() has made manipulations in memory.
@@ -1009,55 +1009,6 @@
 		$sidebars_widgets = $_wp_sidebars_widgets;
 	} else {
 		$sidebars_widgets = get_option('sidebars_widgets', array());
-		$_sidebars_widgets = array();
-
-		if ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) )
-			$sidebars_widgets['array_version'] = 3;
-		elseif ( !isset($sidebars_widgets['array_version']) )
-			$sidebars_widgets['array_version'] = 1;
-
-		switch ( $sidebars_widgets['array_version'] ) {
-			case 1 :
-				foreach ( (array) $sidebars_widgets as $index => $sidebar )
-				if ( is_array($sidebar) )
-				foreach ( (array) $sidebar as $i => $name ) {
-					$id = strtolower($name);
-					if ( isset($wp_registered_widgets[$id]) ) {
-						$_sidebars_widgets[$index][$i] = $id;
-						continue;
-					}
-					$id = sanitize_title($name);
-					if ( isset($wp_registered_widgets[$id]) ) {
-						$_sidebars_widgets[$index][$i] = $id;
-						continue;
-					}
-
-					$found = false;
-
-					foreach ( $wp_registered_widgets as $widget_id => $widget ) {
-						if ( strtolower($widget['name']) == strtolower($name) ) {
-							$_sidebars_widgets[$index][$i] = $widget['id'];
-							$found = true;
-							break;
-						} elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) {
-							$_sidebars_widgets[$index][$i] = $widget['id'];
-							$found = true;
-							break;
-						}
-					}
-
-					if ( $found )
-						continue;
-
-					unset($_sidebars_widgets[$index][$i]);
-				}
-				$_sidebars_widgets['array_version'] = 2;
-				$sidebars_widgets = $_sidebars_widgets;
-				unset($_sidebars_widgets);
-
-			case 2 :
-				$sidebars_widgets = retrieve_widgets();
-		}
 	}
 
 	if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) )
@@ -1219,8 +1170,8 @@
 		$_sidebars_widgets = $old_sidebars_widgets['data'];
 		remove_theme_mod( 'sidebars_widgets' );
 	} else {
-		if ( ! is_array( $sidebars_widgets ) )
-			$sidebars_widgets = wp_get_sidebars_widgets();
+		if ( empty( $sidebars_widgets ) )
+			return;
 
 		$sidebars = array_keys($wp_registered_sidebars);
 
@@ -1234,23 +1185,19 @@
 			return;
 
 		$_sidebars_widgets = array(
-			'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets']
+			'wp_inactive_widgets' => !empty( $sidebars_widgets['wp_inactive_widgets'] ) ? $sidebars_widgets['wp_inactive_widgets'] : array()
 		);
 
 		unset( $sidebars_widgets['wp_inactive_widgets'] );
 
-		foreach ( $wp_registered_sidebars as $id => $settings ) {
-			if ( ! empty( $sidebars_widgets ) )
-				$_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
-		}
+		foreach ( $wp_registered_sidebars as $id => $settings )
+			$_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
 
-		if ( !empty($sidebars_widgets) ) {
-			$orphaned = 0;
+		$orphaned = 0;
 
-			foreach ( $sidebars_widgets as $val ) {
-				if ( is_array($val) && ! empty( $val ) )
-					$_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
-			}
+		foreach ( $sidebars_widgets as $val ) {
+			if ( is_array($val) && ! empty( $val ) )
+				$_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
 		}
 	}
 
