The logic in the change() event handler is not being run when the value is set by val(), but it does run when user selects a value with their mouse
change()
val()
I believe you can manually trigger the change event with trigger():
$("#single").val("Single2").trigger('change');
Though why it doesn't fire automatically, I have no idea.