<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY

Since https://github.com/ansible/ansible/pull/57145, `elements=str` in Arguments_spec raises an error. We need to use elements="str" instead. I've done a workaround for VMware ( ansible-collections/vmware#235 ), but we may see more cases like that in the future. Is this an expected behaviour?

```python
        associable_object_types=dict(
            type='list',
             elements=str,
        ),
```

The error:


```
The full traceback is:
  File "/tmp/ansible_vmware_category_payload_w4g0m32x/ansible_vmware_category_payload.zip/ansible/module_utils/basic.py", line 1775, in _handle_elements
    validated_params.append(type_checker(value, **kwargs))
fatal: [testhost]: FAILED! => {
    "changed": false,
    "invocation": {
        "module_args": {
            "associable_object_types": [
                "Folder"
            ],
            "category_cardinality": "multiple",
            "category_description": "Folder",
            "category_name": "Folder",
            "hostname": "vcenter.test",
            "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "port": 443,
            "protocol": "https",
            "state": "present",
            "username": "administrator@vsphere.local",
            "validate_certs": false
        }
    },
    "msg": "Elements value for option associable_object_types is of type <class 'str'> and we were unable to convert to str: 'param' is an invalid keyword argument for str()"
}

```

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME

lib/ansible/module_utils/basic.py

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
devel
```
try:
                                tmp_stat = os.stat(b_tmp_dest_name)
                                if dest_stat and (tmp_stat.st_uid != dest_stat.st_uid or tmp_stat.st_gid != dest_stat.st_gid):
                                    os.chown(b_tmp_dest_name, dest_stat.st_uid, dest_stat.st_gid)
                            except OSError as e:
                                if e.errno != errno.EPERM:
                                    raise
                            try:
                                os.rename(b_tmp_dest_name, b_dest)
                            except (shutil.Error, OSError, IOError) as e:
                                if unsafe_writes and e.errno == errno.EBUSY:
                                    self._unsafe_writes(b_tmp_dest_name, b_dest)
                                else:
                                    self.fail_json(msg='Unable to make %s into to %s, failed final rename from %s: %s' %
                                                       (src, dest, b_tmp_dest_name, to_native(e)),
                                                   exception=traceback.format_exc())
                        except (shutil.Error, OSError, IOError) as e:
                            self.fail_json(msg='Failed to replace file: %s to %s: %s' % (src, dest, to_native(e)),
                                           exception=traceback.format_exc())
                    finally:
                        self.cleanup(b_tmp_dest_name)
        if creating:
            
            
            umask = os.umask(0)
            os.umask(umask)
            os.chmod(b_dest, DEFAULT_PERM & ~umask)
            try:
                os.chown(b_dest, os.geteuid(), os.getegid())
            except OSError: