ActiveRecord object for billing and shipping addresses
Solution still relying on callbacks

validations in rails accept a "condition" option:

validates :shipping_address, presence: true, unless: :ship_to_billing_address?


for simplicity and consistency, i would advise to use a "real" attribute instead of a virtual one for ship_to_billing_address (attributes accessor generated from boolean columns integrate nicely with checkboxes, and rails automatically generates a ship_to_billing_address? method).

In order to ease access to the shipping address, you could either override the shipping_address method : 

def shipping_address
  ship_to_billing_address? ? billing_address : super
end


...or create another method, if you fear overrides. Problem is, this approach could induce confusion (modifying in place a shipping address that is in fact a billing address without knowing it, for instance)

Solution without callbacks

Have an eye on DCI architecture. Some gems implement it. Using multiple form objects with different validation rules is another option.