> It seems logical to me that a field widget could be a form element, that also happens to map directly to some underlying storage

Widgets are form elements; they just have additional capabilities a form element doesn't have. [The documentation about the field widget API][1] describe the widgets using the following words:

> Widgets are [Form API][2] elements with additional processing capabilities. Widget hooks are typically called by the Field Attach API during the creation of the field form structure with [field_attach_form()][3].

Every widget is implemented using at least one form element, but a module implementing a widgets needs to implement some hooks that are not required from a form element:

- [hook_field_widget_info()][4]
- [hook_field_widget_form()][5]
- [hook_field_widget_error()][6]

While the first can be considered the equivalent of [hook_element_info()][7], the other two are additional hooks necessary for the widgets to work. It's thanks to the information passed to `hook_field_widget_form()` that a widget is rendered.

Drupal could have implemented widgets expanding the properties returned from `hook_element_info()`, but the truth is that a widget and a form element are two different things that are used in different cases. Consider a widget a more specialized type of form element.





  [1]: http://api.drupal.org/api/drupal/modules!field!field.api.php/group/field_widget/7
  [2]: http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html
  [3]: http://api.drupal.org/api/drupal/modules!field!field.attach.inc/function/field_attach_form/7
  [4]: http://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_widget_info/7
  [5]: http://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_widget_form/7
  [6]: http://api.drupal.org/api/drupal/modules!field!field.api.php/function/hook_field_widget_error/7
  [7]: http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_element_info/7