Amazon will usually try to recover the instance (if it is their problem), but in my experience it is quicker to just terminate it and launch a new one if it comes down to that. That said, in two years, I have only had instances 'fail' twice. Amazon will not restart an instance that gets locked up (e.g. excessive swapping, etc). You can use autoscaling to maintain a constant number of instances (if one fails it will automatically start up a new one for you).
You should not have any data requiring persistence on an instance-store volume. With EBS volumes (even root volumes) they can be configured to persist after the instance has been terminated, and will prevent you from losing any data. (Also, the ability to snapshot EBS volumes is extremely helpful).
I might suggest that a significantly overbid persistent spot instance request would restart a failed instance (but Amazon has less support for spot instances from what I can tell - they are meant to be disposable). This approach will not help with a 'frozen' instance.
Depending on what you are serving, you might consider two smaller instances that monitor and loadbalance each other - this greatly decreases the probability that both go down, but should still be used in conjunction with something such as autoscaling. Cloudwatch will help you to monitor if an instance is 'frozen' (I believe 5 minute granularity is free); you probably also want some sort of external monitoring (Pingdom/UploadRobot) just in case.