diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
index f5296b6..e7d5352 100644
--- src/wp-admin/js/customize-nav-menus.js
+++ src/wp-admin/js/customize-nav-menus.js
@@ -1246,16 +1246,21 @@
 					return;
 				}
 
-				var titleEl = control.container.find( '.menu-item-title' );
+				var titleEl = control.container.find( '.menu-item-title' ),
+				    titleText = item.title || api.Menus.data.l10n.untitled;
+
+				if ( item._invalid ) {
+					titleText = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', titleText );
+				}
 
 				// Don't update to an empty title.
 				if ( item.title ) {
 					titleEl
-						.text( item.title )
+						.text( titleText )
 						.removeClass( 'no-title' );
 				} else {
 					titleEl
-						.text( api.Menus.data.l10n.untitled )
+						.text( titleText )
 						.addClass( 'no-title' );
 				}
 			} );
@@ -1299,9 +1304,9 @@
 				'menu-item-edit-inactive'
 			];
 
-			if ( settingValue.invalid ) {
-				containerClasses.push( 'invalid' );
-				control.params.title = api.Menus.data.invalidTitleTpl.replace( '%s', control.params.title );
+			if ( settingValue._invalid ) {
+				containerClasses.push( 'menu-item-invalid' );
+				control.params.title = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', control.params.title );
 			} else if ( 'draft' === settingValue.status ) {
 				containerClasses.push( 'pending' );
 				control.params.title = api.Menus.data.pendingTitleTpl.replace( '%s', control.params.title );
diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
index 2b667ce..0866be4 100644
--- src/wp-includes/class-wp-customize-nav-menus.php
+++ src/wp-includes/class-wp-customize-nav-menus.php
@@ -537,6 +537,11 @@ final class WP_Customize_Nav_Menus {
 
 				$value = (array) $item;
 				$value['nav_menu_term_id'] = $menu_id;
+
+				if ( ! isset( $value['_invalid'] ) ) {
+					$value['_invalid'] = false;
+				}
+
 				$this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array(
 					'value' => $value,
 				) ) );
diff --git src/wp-includes/class-wp-customize-setting.php src/wp-includes/class-wp-customize-setting.php
index 98f37f9..928bf30 100644
--- src/wp-includes/class-wp-customize-setting.php
+++ src/wp-includes/class-wp-customize-setting.php
@@ -690,7 +690,7 @@ class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting {
 		'status'           => 'publish',
 		'original_title'   => '',
 		'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item().
-		// @todo also expose invalid?
+		'_invalid'         => false,
 	);
 
 	/**
@@ -1039,6 +1039,8 @@ class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting {
 		$should_remove = (
 			false === $this_item
 			||
+			true === $this_item['_invalid']
+			||
 			(
 				$this->original_nav_menu_term_id === $menu->term_id
 				&&
@@ -1210,6 +1212,7 @@ class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting {
 			'status'           => 'publish',
 			'original_title'   => '',
 			'nav_menu_term_id' => 0,
+			'_invalid'         => false,
 		);
 		$menu_item_value = array_merge( $default, $menu_item_value );
 		$menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );
