Index: wp-admin/includes/user.php
===================================================================
--- wp-admin/includes/user.php	(revision 22946)
+++ wp-admin/includes/user.php	(working copy)
@@ -184,12 +184,55 @@
 	global $wp_roles;
 
 	$all_roles = $wp_roles->roles;
-	$editable_roles = apply_filters('editable_roles', $all_roles);
+	
+	$default_role_keys = array(
+		'administrator',
+		'editor',
+		'author',
+		'contributor',
+		'subscriber'
+	);
+	
+	$default_roles = array();
+	$custom_roles = array();
+	
+	foreach( $all_roles as $key => $value ) {
+		if( in_array( $key, $default_role_keys ) )
+			$default_roles[ $key ] = $value;
+		else
+			$custom_roles[ $key ] = $value;
+	}
 
+	uasort( $default_roles, '_sort_editable_roles' );
+	uasort( $custom_roles, '_sort_editable_roles' );
+	
+	$editable_roles = array_merge( $default_roles, $custom_roles );
+	$editable_roles = apply_filters( 'editable_roles', $editable_roles );
+
 	return $editable_roles;
 }
 
 /**
+ * Helper function used in the one above - get_editable_roles, as sorting
+ * callback, in order to achieve sorted roles by capabilities.
+ *  
+ * @param array $role_a
+ * @param array $role_b
+ * @return int
+ */
+function _sort_editable_roles($role_a, $role_b) {
+	$first_cap_count = count( $role_a['capabilities'] );
+	$second_cap_count = count( $role_b['capabilities'] );
+
+	// The capability count is equal, sorting by name then.
+	if ( $first_cap_count == $second_cap_count )
+		return strcmp ( $role_a['name'], $role_b['name'] );
+
+	// Less capabilities goes up
+	return ( $first_cap_count > $second_cap_count ) ? 1 : -1;
+}
+
+/**
  * Retrieve user data and filter it.
  *
  * @since 2.0.5
