I think I figured it out.
I went for the override method and although I'm not sure it is the best solution but at least it's short and it's working.
Sure you could make delivery method ID (sort of) to be configurable but for sake of this example I left it as static.
class Cart extends CartCore {
public function getDeliveryOptionList(Country $default_country = null, $flush = false) {
$option_list = parent::getDeliveryOptionList($default_country, $flush);
// get delivery address ID
$id_address_delivery = Context::getContext()->cart->id_address_delivery;
// Get address detail data by ID
$address_data = Address::initialize($id_address_delivery);
if ($address_data->vat_number == '') {
// remove the carrier that is meant only for business customers
unset($option_list[key($option_list)]['3,']);
} else {
// remove the carrier that is meant only for private customers
unset($option_list[key($option_list)]['4,']);
}
return $option_list;
}
}