Index: wp-includes/taxonomy.php
===================================================================
--- wp-includes/taxonomy.php	(revision 21501)
+++ wp-includes/taxonomy.php	(working copy)
@@ -352,16 +352,29 @@
 		add_permastruct( $taxonomy, "{$args['rewrite']['slug']}/%$taxonomy%", $args['rewrite'] );
 	}
 
-	if ( is_null($args['show_ui']) )
-		$args['show_ui'] = $args['public'];
+	if ( ! is_array( $args['public'] ) ) { // $args['public'] defaults to true
+		if ( null === $args['show_ui'] )
+			$args['show_ui'] = $args['public'];
 
-	// Whether to show this type in nav-menus.php. Defaults to the setting for public.
-	if ( null === $args['show_in_nav_menus'] )
-		$args['show_in_nav_menus'] = $args['public'];
+		// Whether to show this taxonomy in nav-menus.php. Defaults to the setting for public.
+		if ( null === $args['show_in_nav_menus'] )
+			$args['show_in_nav_menus'] = $args['public'];
 
-	if ( is_null($args['show_tagcloud']) )
-		$args['show_tagcloud'] = $args['show_ui'];
+		if ( null === $args['show_tagcloud'] )
+			$args['show_tagcloud'] = $args['show_ui'];
+	} else {
+		if ( ! isset( $args['public']['admin_menu'] ) )
+			$args['public']['admin_menu'] = true;
 
+		if ( ! isset( $args['public']['meta_box'] ) )
+			$args['public']['meta_box'] = true;
+
+		if ( $args['public']['admin_menu'] || $args['public']['meta_box'] ) {
+			if ( null === $args['show_ui'] )
+				$args['show_ui'] = true;
+		}
+	}
+	
 	$default_caps = array(
 		'manage_terms' => 'manage_categories',
 		'edit_terms'   => 'manage_categories',
Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 21501)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -110,7 +110,8 @@
 // all taxonomies
 foreach ( get_object_taxonomies($post_type) as $tax_name ) {
 	$taxonomy = get_taxonomy($tax_name);
-	if ( ! $taxonomy->show_ui )
+	if ( ! $taxonomy->show_ui
+		|| ( is_array( $taxonomy->public ) && ! $taxonomy->public['meta_box'] ) )
 		continue;
 
 	$label = $taxonomy->labels->name;
Index: wp-admin/menu.php
===================================================================
--- wp-admin/menu.php	(revision 21501)
+++ wp-admin/menu.php	(working copy)
@@ -53,7 +53,9 @@
 
 	$i = 15;
 	foreach ( get_taxonomies( array(), 'objects' ) as $tax ) {
-		if ( ! $tax->show_ui || ! in_array('post', (array) $tax->object_type, true) )
+		if ( ! $tax->show_ui
+			|| ! in_array('post', (array) $tax->object_type, true )
+			|| ( is_array( $tax->public ) && ! $tax->public['admin_menu'] ) )
 			continue;
 
 		$submenu['edit.php'][$i++] = array( esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, 'edit-tags.php?taxonomy=' . $tax->name );
