Index: tests/phpunit/tests/widgets.php
===================================================================
--- tests/phpunit/tests/widgets.php	(revision 32685)
+++ tests/phpunit/tests/widgets.php	(working copy)
@@ -41,6 +41,24 @@
 	}
 
 	/**
+	 * @see register_widget()
+	 * @see unregister_widget()
+	 * @group 28216
+	 */
+	function test_register_and_unregister_widget_instance() {
+		global $wp_widget_factory;
+
+		$widget = new WP_Widget_Search();
+		$widspl_object_hash = spl_object_hash( $widget );
+
+		register_widget( $widget );
+		$this->assertArrayHasKey( $widspl_object_hash, $wp_widget_factory->widgets );
+
+		unregister_widget( $widget );
+		$this->assertArrayNotHasKey( $widspl_object_hash, $wp_widget_factory->widgets );
+	}
+
+	/**
 	 * @see register_sidebars()
 	 */
 	function test_register_sidebars_single() {
Index: src/wp-includes/widgets.php
===================================================================
--- src/wp-includes/widgets.php	(revision 32685)
+++ src/wp-includes/widgets.php	(working copy)
@@ -573,10 +573,14 @@
 	 * @since 2.8.0
 	 * @access public
 	 *
-	 * @param string $widspl_object_hash The name of a {@see WP_Widget} subclass.
+	 * @param string | WP_Widget $widgetish Either the name of a {@see WP_Widget} subclass or an instance of a {@see WP_Widget} subclass.
 	 */
-	public function register( $widspl_object_hash ) {
-		$this->widgets[$widspl_object_hash] = new $widspl_object_hash();
+	public function register( $widgetish ) {
+		if ( $widgetish instanceof WP_Widget ) {
+			$this->widgets[ spl_object_hash( $widgetish ) ] = $widgetish;
+		} else {
+			$this->widgets[ $widgetish ] = new $widgetish();
+		}
 	}
 
 	/**
@@ -585,10 +589,14 @@
 	 * @since 2.8.0
 	 * @access public
 	 *
-	 * @param string $widspl_object_hash The name of a {@see WP_Widget} subclass.
+	 * @param string | WP_Widget $widgetish Either the name of a {@see WP_Widget} subclass or an instance of a {@see WP_Widget} subclass.
 	 */
-	public function unregister( $widspl_object_hash ) {
-		unset( $this->widgets[ $widspl_object_hash ] );
+	public function unregister( $widgetish ) {
+		if ( $widgetish instanceof WP_Widget ) {
+			unset( $this->widgets[ spl_object_hash( $widgetish ) ] );
+		} else {
+			unset( $this->widgets[ $widgetish ] );
+		}
 	}
 
 	/**
