diff --git src/wp-includes/comment.php src/wp-includes/comment.php
index f0c71af..8515210 100644
--- src/wp-includes/comment.php
+++ src/wp-includes/comment.php
@@ -1458,8 +1458,16 @@ function get_comment_pages_count( $comments = null, $per_page = null, $threaded
  *
  * @since 2.7.0
  *
- * @param int $comment_ID Comment ID.
- * @param array $args Optional args.
+ * @param int   $comment_ID Comment ID.
+ * @param array $args {
+ *	Array of optional arguments.
+ *      @type string     $type      Limit pagination to comments matching a given type. Accepts 'comment', 'trackback',
+ *                                  'pingback', 'pings' (trackbacks and pingbacks), or 'all'. Default is 'all'.
+ *      @type int        $per_page  Per-page count to use when calculating pagination. Defaults to the value of the
+ *                                  'comments_per_page' option.
+ *      @type int|string $max_depth If greater than 1, comment page will be determined for the top-level parent of
+ *                                  `$comment_ID`. Defaults to the value of the 'thread_comments_depth' option.
+ * }
  * @return int|null Comment page number or null on error.
  */
 function get_page_of_comment( $comment_ID, $args = array() ) {
@@ -1491,23 +1499,53 @@ function get_page_of_comment( $comment_ID, $args = array() ) {
 	if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent )
 		return get_page_of_comment( $comment->comment_parent, $args );
 
-	$allowedtypes = array(
-		'comment' => '',
-		'pingback' => 'pingback',
-		'trackback' => 'trackback',
-	);
+	$older_comment_counts = wp_cache_get( $comment_ID, 'comment_pages' );
+
+	if ( ! is_array( $older_comment_counts ) ) {
+		$older_comment_counts = array();
+	}
+
+	$comment_type = $args['type'];
+	if ( isset( $older_comment_counts[ $comment_type ] ) ) {
+		$older_comment_count = (int) $older_comment_counts[ $comment_type ];
+	} else {
+		switch ( $comment_type ) {
+			case 'comment' :
+				$comment_type_where = " AND comment_type = 'comment'";
+				break;
+
+			case 'pingback' :
+				$comment_type_where = " AND comment_type = 'pingback'";
+				break;
+
+			case 'trackback' :
+				$comment_type_where = " AND comment_type = 'trackback'";
+				break;
+
+			case 'pings' :
+				$comment_type_where = " AND comment_type IN ( 'pingback', 'trackback' )";
+				break;
+
+			case 'all' :
+			default :
+				$comment_type_where = '';
+				break;
+		}
 
-	$comtypewhere = ( 'all' != $args['type'] && isset($allowedtypes[$args['type']]) ) ? " AND comment_type = '" . $allowedtypes[$args['type']] . "'" : '';
+		// Count comments older than this one.
+		$older_comment_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt < '%s'" . $comment_type_where, $comment->comment_post_ID, $comment->comment_date_gmt ) );
 
-	// Count comments older than this one
-	$oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt < '%s'" . $comtypewhere, $comment->comment_post_ID, $comment->comment_date_gmt ) );
+		$older_comment_counts[ $comment_type ] = (int) $older_comment_count;
+		wp_cache_add( $comment_ID, $older_comment_counts, 'comment_pages' );
+	}
 
 	// No older comments? Then it's page #1.
-	if ( 0 == $oldercoms )
+	if ( 0 == $older_comment_count ) {
 		return 1;
+	}
 
 	// Divide comments older than this one by comments per page to get this comment's page number
-	return ceil( ( $oldercoms + 1 ) / $args['per_page'] );
+	return intval( ceil( ( $older_comment_count + 1 ) / $args['per_page'] ) );
 }
 
 /**
@@ -2916,6 +2954,35 @@ function update_comment_cache($comments) {
 		wp_cache_add($comment->comment_ID, $comment, 'comment');
 }
 
+/**
+ * Clears the cache used by `get_page_of_comment()`.
+ *
+ * Changes in comment status can affect pagination for all other comments on the post, so we clear caches for all
+ * of the post's comments.
+ *
+ * @since 4.2.0
+ *
+ * @param string $new_status New comment status.
+ * @param string $old_status Old comment status.
+ * @param object $comment    Comment object.
+ */
+function wp_clean_page_of_comment_cache( $new_status, $old_status, $comment ) {
+	$post_comments = get_comments( array(
+		'fields' => 'ids',
+		'status' => 'all',
+		'post_id' => $comment->comment_post_ID,
+	) );
+
+	// If a comment has just been deleted, it won't show up in the query.
+	if ( ! in_array( $comment->comment_ID, $post_comments ) ) {
+		$post_comments[] = $comment->comment_ID;
+	}
+
+	foreach ( $post_comments as $post_comment ) {
+		wp_cache_delete( $post_comment, 'comment_pages' );
+	}
+}
+
 //
 // Internal
 //
diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
index c28594f..f293846 100644
--- src/wp-includes/default-filters.php
+++ src/wp-includes/default-filters.php
@@ -255,6 +255,7 @@ add_action( 'post_updated',               'wp_save_post_revision',
 add_action( 'publish_post',               '_publish_post_hook',                       5, 1 );
 add_action( 'transition_post_status',     '_transition_post_status',                  5, 3 );
 add_action( 'transition_post_status',     '_update_term_count_on_transition_post_status', 10, 3 );
+add_action( 'transition_comment_status',  'wp_clean_page_of_comment_cache',          10, 3 );
 add_action( 'comment_form',               'wp_comment_form_unfiltered_html_nonce'          );
 add_action( 'wp_scheduled_delete',        'wp_scheduled_delete'                            );
 add_action( 'wp_scheduled_auto_draft_delete', 'wp_delete_auto_drafts'                      );
diff --git tests/phpunit/tests/comment/getPageOfComment.php tests/phpunit/tests/comment/getPageOfComment.php
index 5e03a16..09ab649 100644
--- tests/phpunit/tests/comment/getPageOfComment.php
+++ tests/phpunit/tests/comment/getPageOfComment.php
@@ -38,4 +38,136 @@ class Tests_Comment_GetPageOfComment extends WP_UnitTestCase {
 		$this->assertEquals( 1, get_page_of_comment( $comment_first[0], array( 'per_page' =>  3 ) ) );
 		$this->assertEquals( 1, get_page_of_comment( $comment_first[0], array( 'per_page' => 10 ) ) );
 	}
+
+	public function test_type_pings() {
+		$p = $this->factory->post->create();
+		$now = time();
+
+		$trackbacks = array();
+		for ( $i = 0; $i <= 3; $i++ ) {
+			$trackbacks[ $i ] = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_type' => 'trackback', 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now ) ) );
+			$now -= 10 * $i;
+		}
+
+		$pingbacks = array();
+		for ( $i = 0; $i <= 6; $i++ ) {
+			$pingbacks[ $i ] = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_type' => 'pingback', 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now ) ) );
+			$now -= 10 * $i;
+		}
+
+		$this->assertEquals( 2, get_page_of_comment( $trackbacks[0], array( 'per_page' => 2, 'type' => 'trackback' ) ) );
+		$this->assertEquals( 3, get_page_of_comment( $pingbacks[0], array( 'per_page' => 2, 'type' => 'pingback' ) ) );
+		$this->assertEquals( 5, get_page_of_comment( $trackbacks[0], array( 'per_page' => 2, 'type' => 'pings' ) ) );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_subsequent_calls_should_hit_cache() {
+		global $wpdb;
+
+		$p = $this->factory->post->create();
+		$c = $this->factory->comment->create( array( 'comment_post_ID' => $p ) );
+
+		// Prime cache.
+		$page_1 = get_page_of_comment( $c, array( 'per_page' => 3 ) );
+
+		$num_queries = $wpdb->num_queries;
+		$page_2 = get_page_of_comment( $c, array( 'per_page' => 3 ) );
+
+		$this->assertSame( $page_1, $page_2 );
+		$this->assertSame( $num_queries, $wpdb->num_queries );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_cache_hits_should_be_sensitive_to_comment_type() {
+		global $wpdb;
+
+		$p = $this->factory->post->create();
+		$comment = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_type' => 'comment' ) );
+
+		$now = time();
+		$trackbacks = array();
+		for ( $i = 0; $i <= 5; $i++ ) {
+			$trackbacks[ $i ] = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_type' => 'trackback', 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now - ( 10 * $i ) ) ) );
+		}
+
+		// Prime cache for trackbacks.
+		$page_trackbacks = get_page_of_comment( $trackbacks[1], array( 'per_page' => 3, 'type' => 'trackback' ) );
+		$this->assertEquals( 2, $page_trackbacks );
+
+		$num_queries = $wpdb->num_queries;
+		$page_comments = get_page_of_comment( $comment, array( 'per_page' => 3, 'type' => 'comment' ) );
+		$this->assertEquals( 1, $page_comments );
+
+		$this->assertNotEquals( $num_queries, $wpdb->num_queries );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_cache_should_be_invalidated_when_comment_is_approved() {
+		$p = $this->factory->post->create();
+		$c = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_approved' => 0 ) );
+
+		// Prime cache.
+		$page_1 = get_page_of_comment( $c, array( 'per_page' => 3 ) );
+
+		// Approve comment.
+		wp_set_comment_status( $c, 'approve' );
+
+		$this->assertFalse( wp_cache_get( $c, 'comment_pages' ) );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_cache_should_be_invalidated_when_comment_is_deleted() {
+		$p = $this->factory->post->create();
+		$c = $this->factory->comment->create( array( 'comment_post_ID' => $p ) );
+
+		// Prime cache.
+		$page_1 = get_page_of_comment( $c, array( 'per_page' => 3 ) );
+
+		// Trash comment.
+		wp_trash_comment( $c );
+
+		$this->assertFalse( wp_cache_get( $c, 'comment_pages' ) );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_cache_should_be_invalidated_when_comment_is_spammed() {
+		$p = $this->factory->post->create();
+		$c = $this->factory->comment->create( array( 'comment_post_ID' => $p ) );
+
+		// Prime cache.
+		$page_1 = get_page_of_comment( $c, array( 'per_page' => 3 ) );
+
+		// Spam comment.
+		wp_spam_comment( $c );
+
+		$this->assertFalse( wp_cache_get( $c, 'comment_pages' ) );
+	}
+
+	/**
+	 * @ticket 11334
+	 */
+	public function test_cache_should_be_invalidated_when_older_comment_is_published() {
+		$now = time();
+
+		$p = $this->factory->post->create();
+		$c1 = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now ) ) );
+		$c2 = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now - 20 ) ) );
+		$c3 = $this->factory->comment->create( array( 'comment_post_ID' => $p, 'comment_approved' => 0, 'comment_date_gmt' => date( 'Y-m-d H:i:s', $now - 30 ) ) );
+
+		$this->assertEquals( 1, get_page_of_comment( $c1, array( 'per_page' => 2 ) ) );
+
+		wp_set_comment_status( $c3, '1' );
+
+		$this->assertEquals( 2, get_page_of_comment( $c1, array( 'per_page' => 2 ) ) );
+	}
 }
