Index: wp-includes/nav-menu-template.php
===================================================================
--- wp-includes/nav-menu-template.php	(revision 15218)
+++ wp-includes/nav-menu-template.php	(working copy)
@@ -151,7 +151,7 @@
 	if ( ! $menu && !$args->theme_location ) {
 		$menus = wp_get_nav_menus();
 		foreach ( $menus as $menu_maybe ) {
-			if ( $menu_items = wp_get_nav_menu_items($menu_maybe->term_id) ) {
+			if ( $menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array( 'public' => true ) ) ) {
 				$menu = $menu_maybe;
 				break;
 			}
@@ -160,7 +160,7 @@
 
 	// If the menu exists, get its items.
 	if ( $menu && ! is_wp_error($menu) && !isset($menu_items) )
-		$menu_items = wp_get_nav_menu_items( $menu->term_id );
+		$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'public' => true ) );
 
 	// If no menu was found or if the menu has no items and no location was requested, call the fallback_cb if it exists
 	if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
Index: wp-includes/nav-menu.php
===================================================================
--- wp-includes/nav-menu.php	(revision 15218)
+++ wp-includes/nav-menu.php	(working copy)
@@ -454,8 +454,10 @@
 
 	$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
 		'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true,
-		'update_post_term_cache' => false );
+		'update_post_term_cache' => false, 'public' => false );
 	$args = wp_parse_args( $args, $defaults );
+	$public_consumption = $args['public'];
+	unset( $args['public'] );
 	if ( count( $items ) > 1 )
 		$args['include'] = implode( ',', $items );
 	else
@@ -497,7 +499,10 @@
 		unset($terms);
 	}
 
-	$items = array_map( 'wp_setup_nav_menu_item', $items );
+	if ( $public_consumption )
+		$items = array_filter( array_map( 'wp_setup_nav_menu_item_published', $items ) );
+	else
+		$items = array_map( 'wp_setup_nav_menu_item', $items );
 
 	if ( ARRAY_A == $args['output'] ) {
 		$GLOBALS['_menu_item_sort_prop'] = $args['output_key'];
@@ -512,6 +517,16 @@
 }
 
 /**
+ * Callback that wraps wp_setup_nav_menu_item() to ensure only published posts are shown publicly.
+ *
+ * @uses wp_setup_nav_menu_item()
+ * @since 3.0.0
+ */
+function wp_setup_nav_menu_item_published( $menu_item ) {
+	return wp_setup_nav_menu_item( $menu_item, array( 'post_object_status' => 'publish' ) );
+}
+
+/**
  * Decorates a menu item object with the shared navigation menu item properties.
  *
  * Properties:
@@ -533,9 +548,13 @@
  * @since 3.0.0
  *
  * @param object $menu_item The menu item to modify.
+ * @param array $args
  * @return object $menu_item The menu item with standard menu item properties.
  */
-function wp_setup_nav_menu_item( $menu_item ) {
+function wp_setup_nav_menu_item( $menu_item, $args ) {
+	$defaults = array( 'post_object_status' => 'any' );
+	$args = wp_parse_args( $args, $defaults );
+
 	if ( isset( $menu_item->post_type ) ) {
 		if ( 'nav_menu_item' == $menu_item->post_type ) {
 			$menu_item->db_id = (int) $menu_item->ID;
@@ -545,11 +564,14 @@
 			$menu_item->type = empty( $menu_item->type ) ? get_post_meta( $menu_item->ID, '_menu_item_type', true ) : $menu_item->type;
 
 			if ( 'post_type' == $menu_item->type ) {
+				$original_object = get_post( $menu_item->object_id );
+				if ( 'publish' == $args['post_object_status'] && $original_object->post_status != 'publish' )
+					return null;
+
 				$object = get_post_type_object( $menu_item->object );
 				$menu_item->type_label = $object->labels->singular_name;
 				$menu_item->url = get_permalink( $menu_item->object_id );
 
-				$original_object = get_post( $menu_item->object_id );
 				$original_title = $original_object->post_title;
 				$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
 
