I never found out what led to the behavior of this behavior, but everything works with Rails 3.2.13. Using serialize :prefs, Hash :
[1] pry(main)> User.new => #<User id: nil, prefs: {:foo=>"bar"}, created_at: nil, updated_at: nil> [2] pry(main)> User.new.prefs => {:foo=>"bar"}
And using store :prefs, accessors: [:foo] :
[1] pry(main)> User.new => #<User id: nil, prefs: {:foo=>"bar"}, created_at: nil, updated_at: nil> [2] pry(main)> User.new.foo => "bar"
My migration:
add_column :user, :prefs, :text, default: { foo: 'bar' }.to_yaml
source share