Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 37175)
+++ src/wp-includes/post.php	(working copy)
@@ -670,7 +670,7 @@
  *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
  *                                                  Default is value of $internal.
  * }
- * @return object
+ * @return WP_Post_Status the new post status object
  */
 function register_post_status( $post_status, $args = array() ) {
 	global $wp_post_statuses;
@@ -678,63 +678,11 @@
 	if (!is_array($wp_post_statuses))
 		$wp_post_statuses = array();
 
-	// Args prefixed with an underscore are reserved for internal use.
-	$defaults = array(
-		'label' => false,
-		'label_count' => false,
-		'exclude_from_search' => null,
-		'_builtin' => false,
-		'public' => null,
-		'internal' => null,
-		'protected' => null,
-		'private' => null,
-		'publicly_queryable' => null,
-		'show_in_admin_status_list' => null,
-		'show_in_admin_all_list' => null,
-	);
-	$args = wp_parse_args($args, $defaults);
-	$args = (object) $args;
+	$post_status_object = new WP_Post_Status( $post_status, $args );
 
-	$post_status = sanitize_key($post_status);
-	$args->name = $post_status;
+	$wp_post_statuses[ $post_status ] = $post_status_object;
 
-	// Set various defaults.
-	if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private )
-		$args->internal = true;
-
-	if ( null === $args->public  )
-		$args->public = false;
-
-	if ( null === $args->private  )
-		$args->private = false;
-
-	if ( null === $args->protected  )
-		$args->protected = false;
-
-	if ( null === $args->internal  )
-		$args->internal = false;
-
-	if ( null === $args->publicly_queryable )
-		$args->publicly_queryable = $args->public;
-
-	if ( null === $args->exclude_from_search )
-		$args->exclude_from_search = $args->internal;
-
-	if ( null === $args->show_in_admin_all_list )
-		$args->show_in_admin_all_list = !$args->internal;
-
-	if ( null === $args->show_in_admin_status_list )
-		$args->show_in_admin_status_list = !$args->internal;
-
-	if ( false === $args->label )
-		$args->label = $post_status;
-
-	if ( false === $args->label_count )
-		$args->label_count = array( $args->label, $args->label );
-
-	$wp_post_statuses[$post_status] = $args;
-
-	return $args;
+	return $post_status_object;
 }
 
 /**
@@ -747,15 +695,10 @@
  * @see register_post_status()
  *
  * @param string $post_status The name of a registered post status.
- * @return object|null A post status object.
+ * @return WP_Post_Status|null A post status object.
  */
 function get_post_status_object( $post_status ) {
-	global $wp_post_statuses;
-
-	if ( empty($wp_post_statuses[$post_status]) )
-		return null;
-
-	return $wp_post_statuses[$post_status];
+	return WP_Post_Status::get_instance( $post_status );
 }
 
 /**
Index: src/wp-settings.php
===================================================================
--- src/wp-settings.php	(revision 37175)
+++ src/wp-settings.php	(working copy)
@@ -142,6 +142,7 @@
 require( ABSPATH . WPINC . '/post.php' );
 require( ABSPATH . WPINC . '/class-walker-page.php' );
 require( ABSPATH . WPINC . '/class-walker-page-dropdown.php' );
+require( ABSPATH . WPINC . '/class-wp-post-status.php' );
 require( ABSPATH . WPINC . '/class-wp-post.php' );
 require( ABSPATH . WPINC . '/post-template.php' );
 require( ABSPATH . WPINC . '/revision.php' );
