Index: wp-admin/network/site-users.php
--- wp-admin/network/site-users.php
+++ wp-admin/network/site-users.php
@@ -128,6 +128,7 @@
 			if ( isset( $_REQUEST['users'] ) ) {
 				$userids = $_REQUEST['users'];
 				$update = 'promote';
+				$blog_roles = array_keys( $editable_roles );
 				foreach ( $userids as $user_id ) {
 					$user_id = (int) $user_id;
 
@@ -136,7 +137,16 @@
 						wp_die( __( 'Cheatin&#8217; uh?' ), 403 );
 
 					$user = get_userdata( $user_id );
-					$user->set_role( $_REQUEST['new_role'] );
+
+					// Remove any blog roles for this user
+					foreach ( $blog_roles as $blog_role ) {
+						if ( $user->has_cap( $blog_role ) ) {
+							$user->remove_role( $blog_role );
+						}
+					}
+
+					// Add  back the role being bulk-set
+					$user->add_role( $_REQUEST['new_role'] );
 				}
 			} else {
 				$update = 'err_promote';
Index: wp-admin/users.php
--- wp-admin/users.php
+++ wp-admin/users.php
@@ -114,6 +114,7 @@
 
 	$userids = $_REQUEST['users'];
 	$update = 'promote';
+	$blog_roles = array_keys( $editable_roles );
 	foreach ( $userids as $id ) {
 		$id = (int) $id;
 
@@ -131,7 +132,16 @@
 			wp_die( __( 'Cheatin&#8217; uh?' ), 403 );
 
 		$user = get_userdata( $id );
-		$user->set_role($_REQUEST['new_role']);
+
+		// Remove any blog roles for this user
+		foreach ( $blog_roles as $blog_role ) {
+			if ( $user->has_cap( $blog_role ) ) {
+				$user->remove_role( $blog_role );
+			}
+		}
+
+		// Add  back the role being bulk-set
+		$user->add_role( $_REQUEST['new_role'] );
 	}
 