diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
index c28594f..52e2339 100644
--- src/wp-includes/default-filters.php
+++ src/wp-includes/default-filters.php
@@ -276,6 +276,9 @@ add_action( 'end_fetch_post_thumbnail_html',   '_wp_post_thumbnail_class_filter_
 add_action( 'template_redirect', 'wp_old_slug_redirect'              );
 add_action( 'post_updated',      'wp_check_for_changed_slugs', 12, 3 );
 
+// Resolve Numeric Slugs
+add_action( 'pre_get_posts',     'wp_resolve_numeric_slugs',    1, 1 );
+
 // Nonce check for Post Previews
 add_action( 'init', '_show_post_preview' );
 
diff --git src/wp-includes/query.php src/wp-includes/query.php
index 27d8c26..a287156 100644
--- src/wp-includes/query.php
+++ src/wp-includes/query.php
@@ -4723,3 +4723,205 @@ function setup_postdata( $post ) {
 
 	return false;
 }
+
+/**
+ * Resolves numeric slugs that collide with date permalinks.
+ *
+ * @since 4.2.0
+ * @uses $wp_query
+ *
+ * @param object $query The WP_Query instance.
+ */
+function wp_resolve_numeric_slugs( $query ) {
+
+	// Only attempt to resolve date queries for non administrative requests
+	if ( ! is_admin() && $query->is_date() ) {
+
+		// Setup tokens
+		preg_match_all( '/%.+?%/', get_option( 'permalink_structure' ), $tokens );
+		$token_index = 1;
+
+		// Loop over the offending permalink structures and attempt to resolve them.
+		foreach ( (array) $tokens[0] as $token ) {
+
+			// Only resolve the '%postname%' token
+			if ( '%postname%' == $token ) {
+
+				// Boolean check for date tokens
+				$date_tokens = count( array_intersect( $tokens[0], array( '%year%', '%monthnum%', '%day%' ) ) ) > 0;
+				
+				/**
+				 * Filter the post types that should resolve numeric slug date collisions.
+				 *
+				 * @since 4.2.0
+				 *
+				 * @param string|array $post_type Post type or array of post types. Default 'post'.
+				 */
+				$post_type = apply_filters( 'wp_resolve_numeric_slugs', 'post' );
+
+				// Resolve '%day%' segment for '%monthnum%'
+				if ( $date_tokens && $token_index == 3 && $tokens[0][1] == '%monthnum%' ) {
+
+					_wp_resolve_numeric_slug( $query, array( 'var' => 'day', 'condition' => 'is_day', 'post_type' => $post_type ) );
+
+				// Resolve '%monthnum%' segment for '%year%'
+				} else if ( $date_tokens && $token_index == 2 && $tokens[0][0] == '%year%' ) {
+
+					_wp_resolve_numeric_slug( $query, array( 'var' => 'monthnum', 'condition' => 'is_month', 'post_type' => $post_type ) );
+
+				// Resolve the lone '%postname%'
+				} else if ( $token_index == 1 ) {
+
+					_wp_resolve_numeric_slug( $query, array( 'post_type' => $post_type ) );
+
+				}
+
+			}
+
+			$token_index++;
+
+		}
+
+	}
+
+}
+
+/**
+ * Helper function to resolve specific numeric slug segments that collide with date permalinks.
+ *
+ * @since 4.2.0
+ * @access private
+ * @uses $wp_query
+ *
+ * @param object $query The WP_Query instance.
+ * @param array $args {
+ *     Optional. Array of query arguments.
+ *
+ *     @type string       $var       The variable key to retrieve. Default 'year'.
+ *     @type string       $condition The query condition that should return false. Default 'is_year'.
+ *     @type string|array $post_type Post type or array of post types. Default 'post'.
+ * }
+ */
+function _wp_resolve_numeric_slug( $query, $args = array() ) {
+
+	// Defaults
+	$defaults = array(
+		'var'            => 'year', 
+		'condition'      => 'is_year',
+		'post_type'      => 'post'
+	);
+
+	$args = wp_parse_args( $args, $defaults );
+	extract( $args, EXTR_SKIP );
+
+	// Supported query vars
+	$supported = array( 'year', 'monthnum', 'day' );
+
+	/*
+	 * If we have a WP_Query object and our condition is true or the var is supported, 
+	 * attempt to resolve the slug.
+	 */
+	if ( is_object( $query ) && is_a( $query, 'WP_Query' ) && ( $query->$condition() || in_array( $var, $supported ) ) ) {
+
+		// Get the query var
+		$get = $query->get( $var );
+
+		// Maybe add a leading zero
+		if ( 'year' != $var ) {
+			$get = zeroise( $get, 2 );
+		}
+
+		// Look for a post using the numeric slug
+		$post = get_page_by_path( $get, OBJECT, 'post' );
+
+		// Didn't find a post so treat the slug var as an ID for posts without titles.
+		if ( null == $post ) {
+			$no_title_post = get_post( $get );
+			if ( isset( $no_title_post->post_title ) && '' === $no_title_post->post_title ) {
+				$post = $no_title_post;
+			}
+		}
+
+		// Check that we found a WP_Post object.
+		if ( is_object( $post ) && is_a( $post, 'WP_Post' ) ) {
+
+			// Set the resolve flag
+			$resolve = true;
+
+			// Set the page number search needle
+			$needle = '<!--nextpage-->';
+
+			// Set the page number search haystack
+			$haystack = $post->post_content;
+
+			// Set page number args for years
+			if ( 'year' == $var ) {
+
+				$page_args = array( 'var' => 'monthnum', 'condition' => 'is_month' );
+			
+			// Set page number args for months
+			} else if ( 'monthnum' == $var ) {
+
+				$page_args = array( 'var' => 'day', 'condition' => 'is_day' );
+
+			}
+
+			// Attempt to resolve page numbers
+			if ( ! empty( $page_args ) && false !== strpos( $haystack, $needle ) ) {
+
+				// Get the page query var
+				$page = $query->get( $page_args['var'] );
+
+				// Has pages to resolve
+				if ( '' !== $page && ( $page - 1 ) <= substr_count( $haystack, $needle ) ) {
+
+					// Unset date var
+					unset($query->query[$page_args['var']]);
+					$query->set( $page_args['var'], '' );
+
+					// Update page var
+					$query->set( 'page', "$page" );
+					$query->query['page'] = "$page";
+
+					// Set global
+					$query->$page_args['condition'] = false;
+
+				// Don't resolve none existent pages
+				} else {
+
+					$resolve = false;
+
+				}
+
+			// Don't resolve page numbers for posts that aren't using them
+			} else if ( ! empty( $page_args ) && $query->get( $page_args['var'] ) ) {
+
+				$resolve = false;
+
+			}
+
+			// Highjack the query args
+			if ( true === $resolve ) {
+
+				// Remove old query var
+				unset($query->query[$var]);
+				$query->set( $var, '' );
+
+				// Update name query var
+				$query->set( 'name', $get );
+				$query->query['name'] = $get;
+
+				// Set globals
+				$query->is_date     = false;
+				$query->$condition  = false;
+				$query->is_archive  = false;
+				$query->is_single   = true;
+				$query->is_singular = true;
+
+			}
+
+		}
+
+	}
+
+}
diff --git tests/phpunit/tests/post.php tests/phpunit/tests/post.php
index ae549e0..3af7640 100644
--- tests/phpunit/tests/post.php
+++ tests/phpunit/tests/post.php
@@ -470,6 +470,157 @@ class Tests_Post extends WP_UnitTestCase {
 	}
 
 	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_year_segment_collision_without_title() {
+		global $wp_rewrite, $wpdb;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '',
+			'post_name'    => '2015',
+			'post_date'    => '2015-02-01 01:00:00'
+		) );
+
+		// Force an ID that resembles a year format
+		$wpdb->update( 
+			$wpdb->posts, 
+			array( 
+				'ID'         => '2015', 
+				'guid'       => 'http://example.org/?p=2015'
+			), 
+			array( 'ID' => $id ) 
+		);
+
+		$this->go_to( get_permalink( '2015' ) );
+
+		$this->assertQueryTrue( 'is_single', 'is_singular' );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+	
+	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_year_segment_collision_with_title() {
+		global $wp_rewrite;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '2015',
+			'post_date'    => '2015-02-01 01:00:00',
+		) );
+
+		$this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+
+	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_month_segment_collision_without_title() {
+		global $wp_rewrite;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '',
+			'post_name'    => '02',
+			'post_date'    => '2015-02-01 01:00:00',
+		) );
+
+		$this->go_to( get_permalink( $id ) );
+
+		$this->assertQueryTrue( 'is_single', 'is_singular' );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+
+	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_month_segment_collision_with_title() {
+		global $wp_rewrite;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%year%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '02',
+			'post_date'    => '2015-02-01 01:00:00',
+		) );
+
+		$this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+
+	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_day_segment_collision_without_title() {
+		global $wp_rewrite;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '',
+			'post_name'    => '01',
+			'post_date'    => '2015-02-01 01:00:00',
+		) );
+
+		$this->go_to( get_permalink( $id ) );
+
+		$this->assertQueryTrue( 'is_single', 'is_singular' );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+
+	/**
+	 * @ticket 5305
+	 */
+	function test_permalink_day_segment_collision_with_title() {
+		global $wp_rewrite;
+		$wp_rewrite->init();
+		$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
+		$wp_rewrite->flush_rules();
+
+		$id = $this->factory->post->create( array(
+			'post_author'  => $this->author_id,
+			'post_status'  => 'publish',
+			'post_content' => rand_str(),
+			'post_title'   => '01',
+			'post_date'    => '2015-02-01 01:00:00',
+		) );
+
+		$this->assertEquals( $id, url_to_postid( get_permalink( $id ) ) );
+
+		$wp_rewrite->set_permalink_structure('');
+	}
+
+	/**
 	 * @ticket 21013
 	 */
 	function test_wp_unique_post_slug_with_non_latin_slugs() {
