Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 20738)
+++ wp-includes/default-filters.php	(working copy)
@@ -191,6 +191,7 @@
 add_filter( 'pings_open',               '_close_comments_for_old_post', 10, 2 );
 add_filter( 'editable_slug',            'urldecode'                           );
 add_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object'        );
+add_filter( 'pre_user_display_name',    '_wp_pre_user_display_name', 10, 2    );
 
 // Actions
 add_action( 'wp_head',             'wp_enqueue_scripts',              1     );
Index: wp-includes/user.php
===================================================================
--- wp-includes/user.php	(revision 20738)
+++ wp-includes/user.php	(working copy)
@@ -1291,10 +1291,6 @@
 	if ( !$update && ! defined( 'WP_IMPORTING' ) && email_exists($user_email) )
 		return new WP_Error('existing_user_email', __('This email address is already registered.') );
 
-	if ( empty($display_name) )
-		$display_name = $user_login;
-	$display_name = apply_filters('pre_user_display_name', $display_name);
-
 	if ( empty($nickname) )
 		$nickname = $user_login;
 	$nickname = apply_filters('pre_user_nickname', $nickname);
@@ -1307,6 +1303,10 @@
 		$last_name = '';
 	$last_name = apply_filters('pre_user_last_name', $last_name);
 
+	if ( empty($display_name) )
+		$display_name = $user_login;
+	$display_name = apply_filters('pre_user_display_name', $display_name, $userdata );
+
 	if ( empty($description) )
 		$description = '';
 	$description = apply_filters('pre_user_description', $description);
@@ -1489,3 +1489,23 @@
 	);
 	return apply_filters( 'user_contactmethods', $user_contactmethods, $user );
 }
+
+/**
+ * Create the default display name from the first and last names, but only if
+ * the field is currently empty.
+ *
+ * @access private
+ * @since 3.4
+ *
+ * @param object $display_name String the current display_name value
+ * @param object $userdata Array - The parameters originally passed to wp_insert_user()
+ * @return array $display_name the constructed display name
+ */
+function _wp_pre_user_display_name( $display_name, $userdata = array() ) {
+	if ( empty( $display_name ) ) {
+		if ( !empty( $userdata ) && ( !empty( $userdata['first_name'] ) || !empty( $userdata['last_name'] ) ) ) {
+			return sprintf( _x( '%1$s %2$s', 'Construct user display name from first name and second name' ), $userdata['first_name'], $userdata['last_name'] );
+		}
+	}
+	return $display_name;
+}
\ No newline at end of file
