I had the same problem and couldn't find a solution. After trying many things, it turned out to be something as simple as illogical. Well, in the eyes of a Drupal newbie.
At first I had something like this (stripped down version):
$element['mymodulefieldset'] = array(
'#title' => 'Fieldset title',
'#type' => 'fieldset',
);
and added fields to the fieldset:
$element['mymodulefieldset']['fieldname'] = array(
'#title' => "Field title",
'#type' => 'textfield',
'#default_value' => '',
);
After trying lots of different scenarios I found out the next lines of code did (sort of) work. Instead of inserting a fieldset, I turned the element into a fieldset like this:
$element += array(
'#type' => 'fieldset',
'#tree' => true
);
Then I added fields to the element:
$element['fieldname'] = array(
'#title' => "Field title",
'#type' => 'textfield',
'#default_value' => '',
);
NB: some variables like #title and #weight are controlled by "Home » Administration » Structure » Content types » [YOUR CONTENT TYPE]", others (like #collapsible and #collapsed) can be defined here.
Hope this helps you out!