Index: wp-includes/template-loader.php
===================================================================
--- wp-includes/template-loader.php	(revision 19910)
+++ wp-includes/template-loader.php	(working copy)
@@ -22,6 +22,7 @@
 	$template = false;
 	if     ( is_404()            && $template = get_404_template()            ) :
 	elseif ( is_search()         && $template = get_search_template()         ) :
+	elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
 	elseif ( is_tax()            && $template = get_taxonomy_template()       ) :
 	elseif ( is_front_page()     && $template = get_front_page_template()     ) :
 	elseif ( is_home()           && $template = get_home_template()           ) :
Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 19910)
+++ wp-includes/theme.php	(working copy)
@@ -793,6 +793,23 @@
 }
 
 /**
+ * Retrieve path of post type archive template in current or parent template.
+ *
+ * @since 3.4.0
+ *
+ * @return string
+ */
+function get_post_type_archive_template() {
+	$post_type = get_query_var( 'post_type' );
+
+	$obj = get_post_type_object( $post_type );
+	if ( ! $obj->has_archive )
+		return '';
+
+	return get_archive_template();
+}
+
+/**
  * Retrieve path of author template in current or parent template.
  *
  * @since 1.5.0
Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 19910)
+++ wp-includes/query.php	(working copy)
@@ -2929,7 +2929,12 @@
 		$this->queried_object = null;
 		$this->queried_object_id = 0;
 
-		if ( $this->is_category || $this->is_tag || $this->is_tax ) {
+		if ( $this->is_post_type_archive )
+			$post_type_object = get_post_type_object( $this->get('post_type') );
+
+		if ( $this->is_post_type_archive && $post_type_object->has_archive ) {
+			$this->queried_object = $post_type_object;
+		} elseif ( $this->is_category || $this->is_tag || $this->is_tax ) {
 			$tax_query_in_and = wp_list_filter( $this->tax_query->queries, array( 'operator' => 'NOT IN' ), 'NOT' );
 
 			$query = reset( $tax_query_in_and );
@@ -2947,7 +2952,7 @@
 					_make_cat_compat( $this->queried_object );
 			}
 		} elseif ( $this->is_post_type_archive ) {
-			$this->queried_object = get_post_type_object( $this->get('post_type') );
+			$this->queried_object = $post_type_object;
 		} elseif ( $this->is_posts_page ) {
 			$page_for_posts = get_option('page_for_posts');
 			$this->queried_object = & get_page( $page_for_posts );
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 19910)
+++ wp-includes/general-template.php	(working copy)
@@ -662,6 +662,9 @@
 		return;
 
 	$post_type_obj = get_queried_object();
+	if ( empty( $post_type_obj->has_archive ) )
+		$post_type_obj = get_post_type_object( get_post_type() );
+
 	$title = apply_filters('post_type_archive_title', $post_type_obj->labels->name );
 
 	if ( $display )
@@ -1633,11 +1636,13 @@
 		'authortitle' => __('%1$s %2$s Posts by %3$s Feed'),
 		/* translators: 1: blog name, 2: separator(raquo), 3: search phrase */
 		'searchtitle' => __('%1$s %2$s Search Results for &#8220;%3$s&#8221; Feed'),
+		/* translators: 1: blog name, 2: separator(raquo), 3: generic feed */
+		'generic'     => __('%1$s %2$s %3$s Feed'),
 	);
 
 	$args = wp_parse_args( $args, $defaults );
 
-	if ( is_single() || is_page() ) {
+	if ( is_singular() ) {
 		$id = 0;
 		$post = &get_post( $id );
 
@@ -1645,6 +1650,11 @@
 			$title = sprintf( $args['singletitle'], get_bloginfo('name'), $args['separator'], esc_html( get_the_title() ) );
 			$href = get_post_comments_feed_link( $post->ID );
 		}
+	} elseif ( is_post_type_archive() ) {
+		$post_type_obj = get_queried_object();
+
+		$title = sprintf( $args['generic'], get_bloginfo('name'), $args['separator'], $post_type_obj->labels->name );
+		$href = get_post_type_archive_feed_link( $post_type_obj->name );
 	} elseif ( is_category() ) {
 		$term = get_queried_object();
 
