Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 26964)
+++ wp-includes/post.php	(working copy)
@@ -4520,20 +4520,23 @@
  * @return int Same as $post_id
  */
 function wp_check_for_changed_slugs($post_id, $post, $post_before) {
-	// dont bother if it hasnt changed
-	if ( $post->post_name == $post_before->post_name )
-		return;
+	$old_slugs = (array) get_post_meta($post_id, '_wp_old_slug');
 
 	// we're only concerned with published, non-hierarchical objects
-	if ( $post->post_status != 'publish' || is_post_type_hierarchical( $post->post_type ) )
+	if ( $post->post_status != 'publish' || is_post_type_hierarchical( $post->post_type ) ) {
+		// Delete any values in '_wp_old_slug' added when it was published and non-hierarchical.
+		// Note this means cycling a post from Published to Private to Published will delete old slugs.
+		if ($old_slugs)
+			delete_post_meta($post_id, '_wp_old_slug');
 		return;
+	}
 
-	$old_slugs = (array) get_post_meta($post_id, '_wp_old_slug');
+	// don't bother if it hasn't changed
+	if ( $post->post_name == $post_before->post_name )
+		// if we haven't added this old slug before, add it now
+		if ( !empty( $post_before->post_name ) && !in_array($post_before->post_name, $old_slugs) )
+			add_post_meta($post_id, '_wp_old_slug', $post_before->post_name);
 
-	// if we haven't added this old slug before, add it now
-	if ( !empty( $post_before->post_name ) && !in_array($post_before->post_name, $old_slugs) )
-		add_post_meta($post_id, '_wp_old_slug', $post_before->post_name);
-
 	// if the new slug was used previously, delete it from the list
 	if ( in_array($post->post_name, $old_slugs) )
 		delete_post_meta($post_id, '_wp_old_slug', $post->post_name);
