Index: src/wp-includes/class-wp.php
===================================================================
--- src/wp-includes/class-wp.php	(revision 25658)
+++ src/wp-includes/class-wp.php	(working copy)
@@ -238,7 +238,7 @@
 
 		$this->public_query_vars = apply_filters('query_vars', $this->public_query_vars);
 
-		foreach ( $GLOBALS['wp_post_types'] as $post_type => $t )
+		foreach ( get_post_types( array(), 'objects' ) as $post_type => $t )
 			if ( $t->query_var )
 				$post_type_query_vars[$t->query_var] = $post_type;
 
@@ -271,7 +271,7 @@
 		}
 
 		// Convert urldecoded spaces back into +
-		foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t )
+		foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t )
 			if ( $t->query_var && isset( $this->query_vars[$t->query_var] ) )
 				$this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] );
 
Index: src/wp-includes/query.php
===================================================================
--- src/wp-includes/query.php	(revision 25658)
+++ src/wp-includes/query.php	(working copy)
@@ -1735,7 +1735,7 @@
 			);
 		}
 
-		foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
+		foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) {
 			if ( 'post_tag' == $taxonomy )
 				continue;	// Handled further down in the $q['tag'] block
 
Index: src/wp-includes/rewrite.php
===================================================================
--- src/wp-includes/rewrite.php	(revision 25658)
+++ src/wp-includes/rewrite.php	(working copy)
@@ -338,7 +338,13 @@
 	$url = trim($url, '/');
 
 	$request = $url;
+	$post_type_query_vars = array();
 
+	foreach ( get_post_types( array() , 'objects' ) as $post_type => $t ) {
+		if ( ! empty( $t->query_var ) )
+			$post_type_query_vars[ $t->query_var ] = $post_type;
+	}
+
 	// Look for matches.
 	$request_match = $request;
 	foreach ( (array)$rewrite as $match => $query) {
@@ -365,16 +371,21 @@
 
 			// Filter out non-public query vars
 			global $wp;
-			parse_str($query, $query_vars);
+			parse_str( $query, $query_vars );
 			$query = array();
 			foreach ( (array) $query_vars as $key => $value ) {
-				if ( in_array($key, $wp->public_query_vars) )
+				if ( in_array( $key, $wp->public_query_vars ) ){
 					$query[$key] = $value;
+					if ( isset( $post_type_query_vars[$key] ) ) {
+						$query['post_type'] = $post_type_query_vars[$key];
+						$query['name'] = $value;
+					}
+				}
 			}
 
 			// Do the query
-			$query = new WP_Query($query);
-			if ( !empty($query->posts) && $query->is_singular )
+			$query = new WP_Query( $query );
+			if ( ! empty( $query->posts ) && $query->is_singular )
 				return $query->post->ID;
 			else
 				return 0;
Index: tests/phpunit/tests/rewrite.php
===================================================================
--- tests/phpunit/tests/rewrite.php	(revision 25658)
+++ tests/phpunit/tests/rewrite.php	(working copy)
@@ -32,6 +32,18 @@
 		$this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
 	}
 
+	function test_url_to_postid_custom_post_type() {
+		delete_option( 'rewrite_rules' );
+		
+		$post_type = rand_str( 12 );
+		register_post_type( $post_type, array( 'public' => true ) );
+		
+		$id = $this->factory->post->create( array( 'post_type' => $post_type ) );
+		$this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );		
+		
+		_unregister_post_type( $post_type );		
+	}
+	
 	function test_url_to_postid_hierarchical() {
 
 		$parent_id = $this->factory->post->create( array( 'post_title' => 'Parent', 'post_type' => 'page' ) );
