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();
+		$widget_class = get_class( $widget );
+
+		register_widget( $widget );
+		$this->assertArrayHasKey( $widget_class, $wp_widget_factory->widgets );
+
+		unregister_widget( $widget );
+		$this->assertArrayNotHasKey( $widget_class, $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 $widget_class 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( $widget_class ) {
-		$this->widgets[$widget_class] = new $widget_class();
+	public function register( $widgetish ) {
+		if ( $widgetish instanceof WP_Widget ) {
+			$this->widgets[ get_class( $widgetish ) ] = $widgetish;
+		} else {
+			$this->widgets[ $widgetish ] = new $widgetish();
+		}
 	}
 
 	/**
@@ -585,10 +589,14 @@
 	 * @since 2.8.0
 	 * @access public
 	 *
-	 * @param string $widget_class 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( $widget_class ) {
-		unset( $this->widgets[ $widget_class ] );
+	public function unregister( $widgetish ) {
+		if ( $widgetish instanceof WP_Widget ) {
+			unset( $this->widgets[ get_class( $widgetish ) ] );
+		} else {
+			unset( $this->widgets[ $widgetish ] );
+		}
 	}
 
 	/**
