diff --git src/wp-admin/includes/post.php src/wp-admin/includes/post.php
index 0e19876e51..2f087ccb51 100644
--- src/wp-admin/includes/post.php
+++ src/wp-admin/includes/post.php
@@ -731,23 +731,26 @@ function get_default_post_to_edit( $post_type = 'post', $create_in_db = false )
 }
 
 /**
- * Determine if a post exists based on title, content, and date
+ * Determines if a post exists based on title, content, date and type.
  *
  * @since 2.0.0
+ * @since 5.2.0 Added the `$type` parameter.
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param string $title Post title
- * @param string $content Optional post content
- * @param string $date Optional post date
+ * @param string $title   Post title.
+ * @param string $content Optional post content.
+ * @param string $date    Optional post date.
+ * @param string $type    Optional post type.
  * @return int Post ID if post exists, 0 otherwise.
  */
-function post_exists( $title, $content = '', $date = '' ) {
+function post_exists( $title, $content = '', $date = '', $type = '' ) {
 	global $wpdb;
 
 	$post_title   = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
 	$post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
 	$post_date    = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );
+	$post_type    = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) );
 
 	$query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
 	$args  = array();
@@ -767,6 +770,11 @@ function post_exists( $title, $content = '', $date = '' ) {
 		$args[] = $post_content;
 	}
 
+	if ( ! empty( $type ) ) {
+		$query .= ' AND post_type = %s';
+		$args[] = $post_type;
+	}
+
 	if ( ! empty( $args ) ) {
 		return (int) $wpdb->get_var( $wpdb->prepare( $query, $args ) );
 	}
diff --git tests/phpunit/tests/admin/includesPost.php tests/phpunit/tests/admin/includesPost.php
index d4cc606dcd..e1418f397e 100644
--- tests/phpunit/tests/admin/includesPost.php
+++ tests/phpunit/tests/admin/includesPost.php
@@ -851,4 +851,34 @@ class Tests_Admin_Includes_Post extends WP_UnitTestCase {
 		$this->assertNotFalse( add_meta( $p ) );
 		$this->assertEquals( '', get_post_meta( $p, 'testkey', true ) );
 	}
+
+	/**
+	 * Test the post type support in post_exists().
+	 *
+	 * @ticket 37406
+	 */
+	public function test_post_exists_should_support_post_type() {
+		$title     = 'Foo Bar';
+		$post_type = 'page';
+		$post_id   = self::factory()->post->create( array(
+			'post_title' => $title,
+			'post_type'  => $post_type,
+		) );
+		$this->assertSame( $post_id, post_exists( $title, null, null, $post_type ) );
+	}
+
+	/**
+	 * Test that post_exists() doesn't find an existing page as a post.
+	 *
+	 * @ticket 37406
+	 */
+	public function test_post_exists_should_not_match_a_page_for_post() {
+		$title     = 'Foo Bar';
+		$post_type = 'page';
+		$post_id   = self::factory()->post->create( array(
+			'post_title' => $title,
+			'post_type'  => $post_type,
+		) );
+		$this->assertNotSame( $post_id, post_exists( $title, null, null, 'post' ) );
+	}
 }
