I'm not sure this is an answer, but more a discussion point.
Has anyone ever considered Advanced Custom Fields for building WP menus? I've done this a couple of times, and it allows me to build out a custom structure along with custom menu-item attributes and build out the HTML for the menu without a complicated walker that would be needed with default WP menus.

ACF
if( function_exists('acf_add_local_field_group') ):
acf_add_local_field_group(array (
'key' => 'group_56532ec144a4b',
'title' => 'Menu',
'fields' => array (
array (
'key' => 'field_5653338918f43',
'label' => 'Menus',
'name' => 'menus',
'type' => 'flexible_content',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'button_label' => 'Add Menu',
'min' => '',
'max' => '',
'layouts' => array (
array (
'key' => '56533396b10bc',
'name' => 'menu',
'label' => 'Menu',
'display' => 'block',
'sub_fields' => array (
array (
'key' => 'field_56533fc6f25e7',
'label' => 'Menu Name',
'name' => 'menu__name',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_56532ec718f40',
'label' => 'Menu Items',
'name' => 'menu__items',
'type' => 'flexible_content',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'button_label' => 'Add Menu Item',
'min' => '',
'max' => '',
'layouts' => array (
array (
'key' => '56532eee6ef81',
'name' => 'menuItem',
'label' => 'Menu Item',
'display' => 'block',
'sub_fields' => array (
array (
'key' => 'field_56532f0418f41',
'label' => 'Label',
'name' => 'menuITem__label',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 50,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_565333d218f45',
'label' => 'Class',
'name' => 'menuItem__class',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 50,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_565342ef11b29',
'label' => 'Link Type',
'name' => 'menuItem__type',
'type' => 'radio',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 25,
'class' => '',
'id' => '',
),
'choices' => array (
'page' => 'Page',
'cat' => 'Category',
'url' => 'URL',
'cust' => 'Custom',
),
'other_choice' => 0,
'save_other_choice' => 0,
'default_value' => '',
'layout' => 'vertical',
),
array (
'key' => 'field_56532f2d18f42',
'label' => 'Page',
'name' => 'menuItem__page',
'type' => 'page_link',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'page',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'post_type' => array (
),
'taxonomy' => array (
),
'allow_null' => 0,
'multiple' => 0,
),
array (
'key' => 'field_5653434f11b2a',
'label' => 'Category',
'name' => 'menuItem__cat',
'type' => 'taxonomy',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'cat',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'taxonomy' => 'category',
'field_type' => 'select',
'allow_null' => 0,
'add_term' => 1,
'save_terms' => 0,
'load_terms' => 0,
'return_format' => 'id',
'multiple' => 0,
),
array (
'key' => 'field_5653439311b2c',
'label' => 'Custom',
'name' => 'menuItem__cstm',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'cust',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_5653437011b2b',
'label' => 'URL',
'name' => 'menuItem__url',
'type' => 'url',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'url',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
),
),
'min' => '',
'max' => '',
),
),
),
),
'min' => '',
'max' => '',
),
),
),
),
'location' => array (
array (
array (
'param' => 'options_page',
'operator' => '==',
'value' => 'acf-options-theme-options',
),
),
),
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'hide_on_screen' => '',
'active' => 1,
'description' => '',
));
endif;
UX
function acfMenu($name) {
if( function_exists('get_field') ) :
$getMenus = get_field('menus', 'option');
foreach($getMenus as $menuData) :
if( $menuData['menu__name'] == $name ) :
// Do stuff to build your menu
endif;
endforeach;
endif;
}
This is just a quick sample, but with the options that ACF offers, you could tack all kinds of stuff onto a menu item and then code out the UI at will.
In application to your specific question, one could in turn apply conditional selections to what type of link you're supplying (see attached image). ACF allows many different parameters such as page links, category links, or straight URLs. A conditional selection of these items would allow one to change the type of the menu item without erasing classes or other attributes.