Index: wp-includes/link-template.php
===================================================================
--- wp-includes/link-template.php	(revision 22005)
+++ wp-includes/link-template.php	(working copy)
@@ -834,11 +834,11 @@
 	if ( ! $post_type_obj = get_post_type_object( $post_type ) )
 		return false;
 
-	if ( ! $post_type_obj->has_archive )
+	if ( ! $post_type_obj->has_archive && apply_filters( 'force_has_archive', true ) )
 		return false;
 
 	if ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) ) {
-		$struct = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive;
+		$struct = is_string( $post_type_obj->has_archive ) ? $post_type_obj->has_archive : $post_type_obj->rewrite['slug'];
 		if ( $post_type_obj->rewrite['with_front'] )
 			$struct = $wp_rewrite->front . $struct;
 		else
@@ -865,8 +865,13 @@
 	if ( empty( $feed ) )
 		$feed = $default_feed;
 
+	$has_filter = has_filter( 'force_has_archive', '__return_false' );
+	if ( !$has_filter )
+		add_filter( 'force_has_archive', '__return_false' );
 	if ( ! $link = get_post_type_archive_link( $post_type ) )
 		return false;
+	if ( !$has_filter )
+		remove_filter( 'force_has_archive', '__return_false' );
 	$post_type_obj = get_post_type_object( $post_type );
 	if ( $post_type_obj->rewrite['feeds'] && get_option( 'permalink_structure' ) ) {
 		$link = trailingslashit($link);
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 22005)
+++ wp-includes/post.php	(working copy)
@@ -1173,7 +1173,7 @@
 			$args->rewrite['with_front'] = true;
 		if ( ! isset( $args->rewrite['pages'] ) )
 			$args->rewrite['pages'] = true;
-		if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
+		if ( ! isset( $args->rewrite['feeds'] ) && isset( $args->has_archive ) )
 			$args->rewrite['feeds'] = (bool) $args->has_archive;
 		if ( ! isset( $args->rewrite['ep_mask'] ) ) {
 			if ( isset( $args->permalink_epmask ) )
@@ -1187,19 +1187,20 @@
 		else
 			add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
 
+		$archive_slug = ( is_string( $args->has_archive ) && strlen( $args->has_archive ) ) ? $args->has_archive : $args->rewrite['slug'];
+		if ( $args->rewrite['with_front'] )
+			$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
+		else
+			$archive_slug = $wp_rewrite->root . $archive_slug;
+
+		if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
+			$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
+			add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
+			add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
+		}
+
 		if ( $args->has_archive ) {
-			$archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
-			if ( $args->rewrite['with_front'] )
-				$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
-			else
-				$archive_slug = $wp_rewrite->root . $archive_slug;
-
 			add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
-			if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
-				$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
-				add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
-				add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
-			}
 			if ( $args->rewrite['pages'] )
 				add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
 		}
