I have a few comments:

1. I think it may be more useful to only include states which can be actually transitioned to, accounting for guards.
2. I think the name could be more descriptive, how about `allowed_transitions`?
3. This would be a good opportunity to extract a private method for getting potential transitions.

How about something like this?

```ruby
def allowed_transitions
  current = current_state
  successors_for(current).select do |state|
    begin
      validate_transition(from: current, to: state)
      true
    rescue => TransitionFailedError, GuardFailedError
      false
    end
  end
end

private

def successors_for(from)
  self.class.successors[from] || []
end

...

def validate_transition(options = { from: nil, to: nil, metadata: nil })
  from = to_s_or_nil(options[:from])
  to   = to_s_or_nil(options[:to])

  # Call all guards, they raise exceptions if they fail
  guards_for(from: from, to: to).each do |guard|
    guard.call(@object, last_transition, options[:metadata])
  end

  unless successors_for(from).include?(to)
    raise TransitionFailedError,
          "Cannot transition from '#{from}' to '#{to}'"
  end
end
```