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,21 @@
 }
 
 /**
+ * Retrieve path of post type archive template in current or parent template.
+ *
+ * @since 3.4.0
+ *
+ * @return string
+ */
+function get_post_type_archive_template() {
+	$obj = get_post_type_object( get_query_var( '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)
@@ -3023,7 +3023,7 @@
 		if ( empty( $post_types ) || !$this->is_post_type_archive )
 			return (bool) $this->is_post_type_archive;
 
-		$post_type_object = $this->get_queried_object();
+		$post_type_object = get_post_type_object( $this->get('post_type') );
 
 		return in_array( $post_type_object->name, (array) $post_types );
 	}
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 19910)
+++ wp-includes/general-template.php	(working copy)
@@ -542,6 +542,13 @@
 		$title = single_post_title( '', false );
 	}
 
+	// If there's a post type archive
+	if ( is_post_type_archive() ) {
+		$post_type_object = get_post_type_object( get_query_var( 'post_type' ) );
+		if ( ! $post_type_object->has_archive )
+			$title = post_type_archive_title( '', false );
+	}
+
 	// If there's a category or tag
 	if ( is_category() || is_tag() ) {
 		$title = single_term_title( '', false );
@@ -560,9 +567,10 @@
 		$title = $author->display_name;
 	}
 
-	// If there's a post type archive
-	if ( is_post_type_archive() )
+	// Post type archives with has_archive should override terms.
+	if ( is_post_type_archive() && $post_type_object->has_archive ) {
 		$title = post_type_archive_title( '', false );
+	}
 
 	// If there's a month
 	if ( is_archive() && !empty($m) ) {
@@ -661,7 +669,8 @@
 	if ( ! is_post_type_archive() )
 		return;
 
-	$post_type_obj = get_queried_object();
+	$post_type_obj = get_post_type_object( get_query_var('post_type') );
+
 	$title = apply_filters('post_type_archive_title', $post_type_obj->labels->name );
 
 	if ( $display )
@@ -1633,11 +1642,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 +1656,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_post_type_object( get_query_var('post_type') );
+
+		$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();
 
