diff --git a/src/lua/argparse.lua b/src/lua/argparse.lua
index 84d9d4cd1e2f5cc463da6d16e7bc23e14d2d7750..1471d58460970f50260f2317772ae1545dc57c1b 100644
--- a/src/lua/argparse.lua
+++ b/src/lua/argparse.lua
@@ -31,12 +31,20 @@ local function convert_parameter_simple(name, convert_from, convert_to)
         end
         return converted
     elseif convert_to == 'boolean' then
-        if type(convert_from) ~= 'boolean' then
-            error(
-                ('Bad input for parameter "%s". Expected boolean, got "%s"')
-                :format(name, convert_from)
-            )
+        if type(convert_from) == 'boolean' then
+            return convert_from
+        end
+        convert_from = string.lower(convert_from)
+        if convert_from == '0' or convert_from == 'false' then
+            return false
         end
+        if convert_from == '1' or convert_from == 'true' then
+            return true
+        end
+        error(
+            ('Bad input for parameter "%s". Expected boolean, got "%s"')
+            :format(name, convert_from)
+        )
     elseif convert_to == 'string' then
         if type(convert_from) ~= 'string' then
             error(
diff --git a/test/app/argparse.result b/test/app/argparse.result
index 739ce34f7d495cda95ed7c5cf3337bd09fb3defe..d57693bc2661b3efe77b12c5114044ae71a4f5ad 100644
--- a/test/app/argparse.result
+++ b/test/app/argparse.result
@@ -1,4 +1,11 @@
 -- internal argparse test
+test_run = require('test_run').new()
+---
+...
+test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '")
+---
+- true
+...
 argparse = require('internal.argparse').parse
 ---
 ...
@@ -92,7 +99,7 @@ argparse({'tarantoolctl', 'start', 'instance', '--start', 'lalochka'})
 ...
 argparse({'tarantoolctl', 'start', 'instance', '--start', '--', 'lalochka'})
 ---
-- error: 'builtin/internal.argparse.lua:105: bad argument #5: ID not valid'
+- error: 'builtin/internal.argparse.lua:<line>"]: bad argument #5: ID not valid'
 ...
 argparse({'tarantoolctl', 'start', 'instance', '--start', '-', 'lalochka'})
 ---
@@ -130,17 +137,17 @@ argparse({'--verh=42'}, {'verh'})
 ...
 argparse({'--verh=42'}, {{'verh', 'boolean'}})
 ---
-- error: 'builtin/internal.argparse.lua:35: Bad input for parameter "verh". Expected
+- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected
     boolean, got "42"'
 ...
 argparse({'--verh=42'}, {{'verh', 'boolean+'}})
 ---
-- error: 'builtin/internal.argparse.lua:35: Bad input for parameter "verh". Expected
+- error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "verh". Expected
     boolean, got "42"'
 ...
 argparse({'--verh=42'}, {'niz'})
 ---
-- error: 'builtin/internal.argparse.lua:142: unknown options: verh'
+- error: 'builtin/internal.argparse.lua:<line>"]: unknown options: verh'
 ...
 argparse({'--super-option'})
 ---
@@ -156,3 +163,7 @@ argparse({'tarantoolctl', 'start', 'instance', '--start=lalochka', 'option', '-'
   6: another option
   start: lalochka
 ...
+test_run:cmd("clear filter")
+---
+- true
+...
diff --git a/test/app/argparse.test.lua b/test/app/argparse.test.lua
index 78b24b962343ea0b490f5df1a7b1829fb45a3e63..97c05049bbb91e323e04b5b06dc72a239ffcf14d 100644
--- a/test/app/argparse.test.lua
+++ b/test/app/argparse.test.lua
@@ -1,4 +1,6 @@
 -- internal argparse test
+test_run = require('test_run').new()
+test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '")
 
 argparse = require('internal.argparse').parse
 
@@ -28,3 +30,5 @@ argparse({'--verh=42'}, {{'verh', 'boolean+'}})
 argparse({'--verh=42'}, {'niz'})
 argparse({'--super-option'})
 argparse({'tarantoolctl', 'start', 'instance', '--start=lalochka', 'option', '-', 'another option'})
+
+test_run:cmd("clear filter")
diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.result b/test/app/gh-4076-argparse-wrong-bool-handling.result
new file mode 100644
index 0000000000000000000000000000000000000000..91895b9ed986db9eadd72d7674c16b6730420fec
--- /dev/null
+++ b/test/app/gh-4076-argparse-wrong-bool-handling.result
@@ -0,0 +1,58 @@
+-- test-run result file version 2
+test_run = require('test_run').new()
+ | ---
+ | ...
+test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '")
+ | ---
+ | - true
+ | ...
+argparse = require('internal.argparse').parse
+ | ---
+ | ...
+--
+-- gh-4076: argparse incorrectly processed boolean parameters,
+-- that led to problems with tarantoolctl usage.
+--
+params = {}
+ | ---
+ | ...
+params[1] = {'flag1', 'boolean'}
+ | ---
+ | ...
+params[2] = {'flag2', 'boolean'}
+ | ---
+ | ...
+params[3] = {'flag3', 'boolean'}
+ | ---
+ | ...
+params[4] = {'flag4', 'boolean'}
+ | ---
+ | ...
+params[5] = {'flag5', 'boolean'}
+ | ---
+ | ...
+args = {'--flag1', 'true', '--flag2', '1', '--flag3', 'false', '--flag4', '0', '--flag5', 'TrUe'}
+ | ---
+ | ...
+argparse(args, params)
+ | ---
+ | - flag4: false
+ |   flag1: true
+ |   flag5: true
+ |   flag2: true
+ |   flag3: false
+ | ...
+
+args = {'--flag1', 'abc'}
+ | ---
+ | ...
+argparse(args, params)
+ | ---
+ | - error: 'builtin/internal.argparse.lua:<line>"]: Bad input for parameter "flag1". Expected
+ |     boolean, got "abc"'
+ | ...
+
+test_run:cmd("clear filter")
+ | ---
+ | - true
+ | ...
diff --git a/test/app/gh-4076-argparse-wrong-bool-handling.test.lua b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua
new file mode 100644
index 0000000000000000000000000000000000000000..abd6c6927a115fdbf86ba0e8201e908abad0ffa6
--- /dev/null
+++ b/test/app/gh-4076-argparse-wrong-bool-handling.test.lua
@@ -0,0 +1,20 @@
+test_run = require('test_run').new()
+test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua:<line>\"]: '")
+argparse = require('internal.argparse').parse
+--
+-- gh-4076: argparse incorrectly processed boolean parameters,
+-- that led to problems with tarantoolctl usage.
+--
+params = {}
+params[1] = {'flag1', 'boolean'}
+params[2] = {'flag2', 'boolean'}
+params[3] = {'flag3', 'boolean'}
+params[4] = {'flag4', 'boolean'}
+params[5] = {'flag5', 'boolean'}
+args = {'--flag1', 'true', '--flag2', '1', '--flag3', 'false', '--flag4', '0', '--flag5', 'TrUe'}
+argparse(args, params)
+
+args = {'--flag1', 'abc'}
+argparse(args, params)
+
+test_run:cmd("clear filter")