Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 35810)
+++ src/wp-includes/post.php	(working copy)
@@ -3586,12 +3586,15 @@
 		if ( 'nav_menu_item' == $post_type )
 			return $slug;
 
-		/*
-		 * Page slugs must be unique within their own trees. Pages are in a separate
-		 * namespace than posts so page slugs are allowed to overlap post slugs.
-		 */
-		$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( %s, 'attachment' ) AND ID != %d AND post_parent = %d LIMIT 1";
-		$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID, $post_parent ) );
+		// Ensure the entire URL path is unique, respective of potential collisions.
+		$post_types_with_possible_collisions = array( $post_type, 'attachment' );
+		// Posts and pages can share the same permalink namespace.
+		if( $post_type === 'page' && '/%postname%/' === $wp_rewrite->permalink_structure && $post_parent === 0 ) {
+			$post_types_with_possible_collisions[] = 'post';
+		}
+		$post_types_with_possible_collisions = implode( "', '", $post_types_with_possible_collisions );
+		$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '$post_types_with_possible_collisions' ) AND ID != %d AND post_parent = %d LIMIT 1";
+		$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID, $post_parent ) );
 
 		/**
 		 * Filter whether the post slug would make a bad hierarchical post slug.
@@ -3607,16 +3610,23 @@
 			$suffix = 2;
 			do {
 				$alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
-				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) );
+				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID, $post_parent ) );
 				$suffix++;
 			} while ( $post_name_check );
 			$slug = $alt_post_name;
 		}
 	} else {
-		// Post slugs must be unique across all posts.
-		$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
-		$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID ) );
+		// Ensure the entire URL path is unique, respective of potential collisions.
+		$post_types_with_possible_collisions = array( $post_type );
+		// Posts and pages can share the same permalink namespace.
+		if ( '/%postname%/' == $wp_rewrite->permalink_structure && 'post' === $post_type ) {
+			array_push( $post_types_with_possible_collisions, 'page', 'attachment' );
+		}
+		$post_types_with_possible_collisions = implode( "', '", $post_types_with_possible_collisions );
+		$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '$post_types_with_possible_collisions' ) AND ID != %d LIMIT 1";
 
+		$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID ) );
+
 		// Prevent new post slugs that could result in URLs that conflict with date archives.
 		$post = get_post( $post_ID );
 		$conflicts_with_date_archive = false;
@@ -3652,8 +3662,9 @@
 			$suffix = 2;
 			do {
 				$alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
-				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) );
+				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID ) );
 				$suffix++;
+
 			} while ( $post_name_check );
 			$slug = $alt_post_name;
 		}
Index: tests/phpunit/tests/post.php
===================================================================
--- tests/phpunit/tests/post.php	(revision 35810)
+++ tests/phpunit/tests/post.php	(working copy)
@@ -1253,4 +1253,83 @@
 		$this->assertEquals(get_date_from_gmt($post['post_date_gmt']), $out->post_date);
 		$this->assertEquals($post['post_date_gmt'], $out->post_date_gmt);
 	}
+
+	function test_unique_slug_page_then_post() {
+		global $wp_rewrite;
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$page_args = array(
+			'post_type' => 'page',
+			'post_name' => 'green',
+			'post_status' => 'publish',
+		);
+		$page = $this->factory->post->create( $page_args );
+		$this->assertEquals( 'green', get_post( $page )->post_name );
+
+		$post_args = array(
+			'post_type' => 'post',
+			'post_name' => 'green',
+			'post_status' => 'publish',
+		);
+		$post = $this->factory->post->create( $post_args );
+
+		$this->assertEquals( 'green-2', get_post( $post )->post_name );
+		$wp_rewrite->flush_rules();
+	}
+
+	function test_unique_slug_post_then_page() {
+		global $wp_rewrite;
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$post_args = array(
+			'post_type' => 'post',
+			'post_name' => 'red'
+		);
+		$post = $this->factory->post->create( $post_args );
+		$this->assertEquals( 'red', get_post( $post )->post_name );
+
+		$page_args = array(
+			'post_type' => 'page',
+			'post_name' => 'red'
+		);
+		$page = $this->factory->post->create( $page_args );
+		$this->assertEquals( 'red-2', get_post( $page )->post_name );
+		$wp_rewrite->flush_rules();
+	}
+
+	function test_unique_slug_post_then_post() {
+		global $wp_rewrite;
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$post_args = array(
+			'post_type' => 'post',
+			'post_name' => 'blue'
+		);
+		$post = $this->factory->post->create( $post_args );
+		$this->assertEquals( 'blue', get_post( $post )->post_name );
+
+		$post_args = array(
+			'post_type' => 'post',
+			'post_name' => 'blue'
+		);
+		$post = $this->factory->post->create( $post_args );
+		$this->assertEquals( 'blue-2', get_post( $post )->post_name );
+		$wp_rewrite->flush_rules();
+	}
+
+	function test_unique_slug_page_then_page() {
+		global $wp_rewrite;
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$page_args = array(
+			'post_type' => 'page',
+			'post_name' => 'orange'
+		);
+		$page = $this->factory->post->create( $page_args );
+		$this->assertEquals( 'orange', get_post( $page )->post_name );
+
+		$page_args = array(
+			'post_type' => 'page',
+			'post_name' => 'orange'
+		);
+		$page = $this->factory->post->create( $page_args );
+		$this->assertEquals( 'orange-2', get_post( $page )->post_name );
+		$wp_rewrite->flush_rules();
+	}
 }
