Index: src/wp-includes/l10n.php
===================================================================
--- src/wp-includes/l10n.php	(revision 36252)
+++ src/wp-includes/l10n.php	(working copy)
@@ -793,10 +793,16 @@
  */
 function get_translations_for_domain( $domain ) {
 	global $l10n;
-	if ( !isset( $l10n[$domain] ) ) {
-		$l10n[$domain] = new NOOP_Translations;
+	if ( isset( $l10n[ $domain ] ) ) {
+		return $l10n[ $domain ];
 	}
-	return $l10n[$domain];
+
+	static $noop_translations = null;
+	if ( ! $noop_translations ) {
+		$noop_translations = new NOOP_Translations;
+	}
+
+	return $noop_translations;
 }
 
 /**
Index: tests/phpunit/tests/l10n.php
===================================================================
--- tests/phpunit/tests/l10n.php	(revision 36252)
+++ tests/phpunit/tests/l10n.php	(working copy)
@@ -26,4 +26,24 @@
 		$this->assertEquals( 'first-before-bar|second-before-bar', before_last_bar( 'first-before-bar|second-before-bar|after-last-bar' ) );
 	}
 
+	/**
+	 * @ticket 21319
+	 */
+	function test_is_textdomain_loaded_for_no_translations() {
+		$this->assertFalse( load_textdomain( 'wp-tests-domain', DIR_TESTDATA . '/non-existent-file' ) );
+		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
+		$this->assertInstanceOf( 'NOOP_Translations', get_translations_for_domain( 'wp-tests-domain' ) );
+		// Ensure that we don't confuse NOOP_Translations to be a loaded text domain.
+		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
+		$this->assertFalse( unload_textdomain( 'wp-tests-domain' ) );
+	}
+
+	/**
+	 * @ticket 21319
+	 */
+	function test_is_textdomain_is_not_loaded_after_gettext_call_with_no_translations() {
+		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
+		__( 'just some string', 'wp-tests-domain' );
+		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
+	}
 }
