Index: src/wp-admin/css/common.css
===================================================================
--- src/wp-admin/css/common.css	(revision 37220)
+++ src/wp-admin/css/common.css	(working copy)
@@ -608,6 +608,7 @@
 	text-shadow: none;
 	font-weight: 600;
 	font-size: 13px;
+	cursor: pointer;
 }
 
 .wrap .add-new-h2:hover, /* deprecated */
Index: src/wp-admin/css/themes.css
===================================================================
--- src/wp-admin/css/themes.css	(revision 37221)
+++ src/wp-admin/css/themes.css	(working copy)
@@ -1103,10 +1103,6 @@
 	padding: 40px 0 0;
 	text-align: center;
 }
-body.show-upload-theme .upload-theme + .wp-filter,
-body.show-upload-theme .upload-theme + .wp-filter + .theme-browser {
-	display: none;
-}
 
 p.no-themes {
 	clear: both;
@@ -1123,10 +1119,6 @@
 	display: block;
 }
 
-body.show-upload-theme p.no-themes {
-	display: none !important;
-}
-
 .theme-install-php .add-new-theme {
 	display: none !important;
 }
Index: src/wp-admin/js/theme.js
===================================================================
--- src/wp-admin/js/theme.js	(revision 37221)
+++ src/wp-admin/js/theme.js	(working copy)
@@ -1610,7 +1610,8 @@
 	 */
 	uploader: function() {
 		var uploadViewToggle = $( '.upload-view-toggle' ),
-			$body = $( document.body );
+			$body = $( document.body ),
+			uploaderOpen;
 
 		uploadViewToggle
 			.attr({
@@ -1620,7 +1621,13 @@
 			.on( 'click', function( event ) {
 				event.preventDefault();
 				$body.toggleClass( 'show-upload-view' );
-				uploadViewToggle.attr( 'aria-expanded', $body.hasClass( 'show-upload-view' ) );
+				uploaderOpen = $body.hasClass( 'show-upload-view' )
+				uploadViewToggle.attr( 'aria-expanded', uploaderOpen );
+				if ( uploaderOpen ) {
+					themes.router.navigate( themes.router.baseUrl( '?upload' ), { replace: true } );
+				} else {
+					themes.router.navigate( themes.router.baseUrl( '' ), { replace: true } );
+				}
 			});
 	},
 
@@ -1759,7 +1766,7 @@
 
 		// Support the `upload` route by going straight to upload section
 		themes.router.on( 'route:upload', function() {
-			$( 'a.upload' ).trigger( 'click' );
+			$( '.upload-view-toggle' ).trigger( 'click' );
 		});
 
 		// The `search` route event. The router populates the input field.
Index: src/wp-admin/theme-install.php
===================================================================
--- src/wp-admin/theme-install.php	(revision 37221)
+++ src/wp-admin/theme-install.php	(working copy)
@@ -127,17 +127,20 @@
 	 */
 	$tabs = apply_filters( 'install_themes_tabs', array( 'upload' => __( 'Upload Theme' ) ) );
 	if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) {
-		echo ' <a href="#" class="upload-view-toggle page-title-action">' . __( 'Upload Theme' ) . '</a>';
+		echo ' <button type="button" class="upload-view-toggle page-title-action hide-if-no-js">' . __( 'Upload Theme' ) . '</button>';
 	}
 	?></h1>
+	<div class="error hide-if-js">
+		<p><?php _e( 'The Theme Installer screen requires JavaScript.' ); ?></p>
+	</div>
 
 	<div class="upload-theme">
 	<?php install_themes_upload(); ?>
 	</div>
 
-	<h2 class="screen-reader-text"><?php _e( 'Filter themes list' ); ?></h2>
+	<h2 class="screen-reader-text hide-if-no-js"><?php _e( 'Filter themes list' ); ?></h2>
 
-	<div class="wp-filter">
+	<div class="wp-filter hide-if-no-js">
 		<div class="filter-count">
 			<span class="count theme-count"></span>
 		</div>
@@ -201,7 +204,7 @@
 			</div>
 		</div>
 	</div>
-	<h2 class="screen-reader-text"><?php _e( 'Themes list' ); ?></h2>
+	<h2 class="screen-reader-text hide-if-no-js"><?php _e( 'Themes list' ); ?></h2>
 	<div class="theme-browser content-filterable"></div>
 	<div class="theme-install-overlay wp-full-overlay expanded"></div>
 
