Slightly better would be
function add_first_and_last($output) {
$output = preg_replace('/class="menu-item/', 'class="first-menu-item menu-item', $output, 1);
$output = substr_replace($output, 'class="last-menu-item menu-item', strripos($output, 'class="menu-item'), strlen('class="menu-item'));
return $output;
}
add_filter('wp_nav_menu', 'add_first_and_last');
This forces the extra markup to be added to the class list for the respective elements, rather than having more than one ID for a tag.
Feels like there should be a more elegant solution though.