Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 21271)
+++ wp-includes/post.php	(working copy)
@@ -403,6 +403,7 @@
 			$_post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id));
 			if ( ! $_post )
 				return $null;
+            $_post = WP_Post::get_instance($_post);
 			_get_post_ancestors($_post);
 			$_post = sanitize_post($_post, 'raw');
 			wp_cache_add($_post->ID, $_post, 'posts');
Index: wp-includes/post-template.php
===================================================================
--- wp-includes/post-template.php	(revision 21271)
+++ wp-includes/post-template.php	(working copy)
@@ -102,20 +102,7 @@
  */
 function get_the_title( $id = 0 ) {
 	$post = &get_post($id);
-
-	$title = isset($post->post_title) ? $post->post_title : '';
-	$id = isset($post->ID) ? $post->ID : (int) $id;
-
-	if ( !is_admin() ) {
-		if ( !empty($post->post_password) ) {
-			$protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
-			$title = sprintf($protected_title_format, $title);
-		} else if ( isset($post->post_status) && 'private' == $post->post_status ) {
-			$private_title_format = apply_filters('private_title_format', __('Private: %s'));
-			$title = sprintf($private_title_format, $title);
-		}
-	}
-	return apply_filters( 'the_title', $title, $id );
+	return $post->get_the_title($id);
 }
 
 /**
Index: wp-includes/class-wp-post.php
===================================================================
--- wp-includes/class-wp-post.php	(revision 0)
+++ wp-includes/class-wp-post.php	(revision 0)
@@ -0,0 +1,65 @@
+<?php
+
+class WP_Post {
+	public $ID;
+	public $post_author;
+	public $post_date;
+	public $post_date_gmt;
+	public $post_content;
+	public $post_title;
+	public $post_excerpt;
+	public $post_status;
+	public $comment_status;
+	public $ping_status;
+	public $post_password;
+	public $post_name;
+	public $to_ping;
+	public $pinged;
+	public $post_modified;
+	public $post_modified_gmt;
+	public $post_content_filtered;
+	public $post_parent;
+	public $guid;
+	public $menu_order;
+	public $post_type;
+	public $post_mime_type;
+	public $comment_count;
+	public $filter;
+
+	public static function get_instance( $post_data ) {
+		$post = new WP_Post();
+
+		foreach ( $post_data as $k=>$v ) {
+			if ( property_exists('WP_Post', $k) ) {
+				$post->$k = $v;
+			}
+		}
+
+		return $post;
+	}
+
+	public function __set( $name, $value ) {
+		if ( property_exists('WP_Post', $name) ) {
+			$this->$name = $value;
+			return $this->$name;
+		}
+
+		return false;
+	}
+
+	public function get_the_title( $id = 0 ) {
+		$title = isset($this->post_title) ? $this->post_title : '';
+		$id = isset($this->ID) ? $this->ID : (int) $id;
+
+		if ( !is_admin() ) {
+			if ( !empty($this->post_password) ) {
+				$protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
+				$title = sprintf($protected_title_format, $title);
+			} else if ( isset($this->post_status) && 'private' == $this->post_status ) {
+				$private_title_format = apply_filters('private_title_format', __('Private: %s'));
+				$title = sprintf($private_title_format, $title);
+			}
+		}
+		return apply_filters( 'the_title', $title, $id );
+	}
+}
Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 21271)
+++ wp-includes/query.php	(working copy)
@@ -2660,6 +2660,11 @@
 		if ( !$q['suppress_filters'] )
 			$this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) );
 
+		// Convert posts to WP_Post objects
+		if ( is_array($this->posts) ) {
+			$this->posts = array_map(array( 'WP_Post', 'get_instance' ), $this->posts );
+		}
+
 		if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
 			$cjoin = apply_filters_ref_array('comment_feed_join', array( '', &$this ) );
 			$cwhere = apply_filters_ref_array('comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) );
Index: wp-settings.php
===================================================================
--- wp-settings.php	(revision 21271)
+++ wp-settings.php	(working copy)
@@ -142,6 +142,7 @@
 require( ABSPATH . WPINC . '/nav-menu.php' );
 require( ABSPATH . WPINC . '/nav-menu-template.php' );
 require( ABSPATH . WPINC . '/admin-bar.php' );
+require( ABSPATH . WPINC . '/class-wp-post.php' );
 
 // Load multisite-specific files.
 if ( is_multisite() ) {
