From semantic point of view, しゃべる seems to refer to an act of speaking that is less consistent and intentional than はなす.
A verbal modifier -chirasu means, "doing something away." It can combine with しゃべる to mean "chattering away" but はなしちらす sounds odd. The two verbs can derive nouns with o- prefix (signifying respect or endearment). The former yields おしゃべり, meaning chatter or a talkative person, whereas the latter, おはなし which only means a story. Such usage as above may contribute to the fact that しゃべる is regarded as a lower register than はなす.
In terms of syntactic difference, I am under impression that しゃべる is not very good at taking a direct object noun governed by -o. Here are some contrasts:
To tell the truth
To tell the reason
To speak Latvian
In my post above, I used しゃべる in context of speaking Japanese. The example is grammatically okay since the verb is suffixed with -reru suffix that denotes potential sense. Come to think of it, however, 日本語がしゃべれる is less acceptable than 日本語が話せる, not only because of the register issue but also due to some syntactic constraints.
Before making any more fatal faux pas, I entrust our fellow Japanese posters with the task of refuting or augmenting my points. qui tacet consentire videtur.